第二篇博客:
以汽车为例 : 假设汽车有开车的方法, 也有创建汽车的方法
二话不说 满足开闭原则 定义抽象类 和接口
1.定义 抽象的车 ---车子有一个Drive开车的方法
namespace 抽象工厂模式 { /// <summary> /// 抽象产品 抽象----车 /// </summary> interface ICar { void Drive();//开车的方法 } }
namespace 抽象工厂模式 { /// <summary> /// 抽象工厂 /// </summary> interface ICreateFactory { ICar CreateCar();//创建车子--这里返回类型是 抽象的ICar } }
namespace 抽象工厂模式 { /// <summary> /// 具体Car 继承自抽象Car /// </summary> public class BMW:ICar { /// <summary> /// 开车的方法 /// </summary> public void Drive() { Console.Write("宝马车正在行驶\r\n"); } } }
namespace 抽象工厂模式 { /// <summary> /// 继承自抽象工厂 /// </summary> class BMWFactory:ICreateFactory { /// <summary> /// 在BMWFactory的工厂里创建 /// </summary> /// <returns></returns> public ICar CreateCar() { Console.Write("创建宝马车。。。。\r\n"); return new BMW(); } } }
配置文件:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="FactoryInstance" value="抽象工厂模式.BMWFactory"/> </appSettings> </configuration>
客户端:
namespace 抽象工厂模式 { class Program { /// <summary> /// ------------------抽象工厂模式思路---------------- /// 1.创建一个抽象工厂和一个抽象产品()一个工厂对应一个产品 /// 2.建立具体工厂和具体产品 /// 客户端实现: /// 3.1定义抽象对象 /// 3.2读取配置文件 /// 3.3反射实例(实例是ICreateFactory的子类-转换为父类) /// 3.4反射实例(实例化对象后返回类型为具体产品对应的对象(Icar的子类)---在子类出现的地方父类一定能出现) /// 3.5调用其方法 /// (新增加同种产品不需要修改源代码,直接创建相应的具体工厂和具体产品) /// </summary> /// <param name="args"></param> static void Main(string[] args) { ICar iCar;//抽象产品 抽象的Car ICreateFactory createFactory;//抽象工厂 try { string str = ConfigurationManager.AppSettings["FactoryInstance"];//读取配置文件 //3.4反射实例(实例化对象后返回类型为具体产品对应的对象(Icar的子类)---(依赖倒转原则)在子类出现的地方父类一定能出现) createFactory = Assembly.Load("抽象工厂模式").CreateInstance(str) as ICreateFactory; iCar = createFactory.CreateCar();//--创建好的对象 赋值给父类Icar(如:BMW是ICar滴子类)----具体产品 iCar.Drive();//开车的方法 Console.ReadKey(); } catch(Exception e) { Console.Write("代码出错了!!!\r\n"+e.ToString()); Console.ReadKey(); } } } }
结果:创建宝马车。。。 宝马车正在行驶
如果要添加新的类 比如:
现在有新的车子 奔驰 怎么添加呢?
代码如下:
1.定义奔驰车:
namespace 抽象工厂模式 { /// <summary> /// 奔驰车 /// </summary> class Benz:ICar { public void Drive() { Console.Write("奔驰正在行驶。。。\r\n"); } } }
2.奔驰的工厂--用来创建奔驰车
namespace 抽象工厂模式 { class BenzFactory:ICreateFactory { public ICar CreateCar() { Console.Write("创建奔驰车。。\r\n"); return new Benz(); } } }
3.配置文件修改下就行了 ---客户端(前台不用修改代码)
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="FactoryInstance" value="抽象工厂模式.BenzFactory"/> </appSettings> </configuration>
继续学习中。。。。。。。
转载于:https://www.cnblogs.com/StoneSH/archive/2013/04/04/2999649.html