一.抽象工厂模式:
在工厂模式中具体的产品和具体的工厂是一一对应的,一个工厂只能生产一种产品,结构单一,例如小米公司刚开始是只生产小米手机,但是伴随着公司的发展,他们需要生产不同型号的手机,也会生产路由器,小米电视等等,那么工厂方法模式已不能满足业务的需求了,此时我们就需要抽象工厂模式,即一个工厂可以生产多种产品。
抽象产品:负责定义抽象工厂生成的产品的接口,在本例中有两个抽象产品类,分别是手机和电视的抽象类
-
-
- 电视(抽象类)
- watchTV
- 手机(抽象类)
- 打电话
- 电视(抽象类)
-
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public abstract class IMobilePhone { public abstract void dial(); } public abstract class ITelevision { public abstract void watchTV(); }
- 具体产品:负责实现抽象类的产
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class MobilePhone : IMobilePhone { private string name; public MobilePhone(string name) { this.name = name; Console.WriteLine("制作手机"+name); } public override void dial() { Console.WriteLine("使用" + name+"打电话"); } } public class Television : ITelevision { private string name; public Television(string name) { this.name = name; Console.WriteLine("制作电视"+name); } public override void watchTV() { Console.WriteLine("通过"+name+"看电视"); } }
- 抽象工厂类抽象工厂角色是负责定义用于生成抽象产品的接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public abstract class Factory { public static Factory getFactory(string classname) { Factory factory = null; try { factory = (Factory)Assembly.Load("设计模式").CreateInstance("设计模式." + classname); } catch (Exception e) { Console.WriteLine("没有找到 " + classname + "类。"); } return factory; } public abstract MobilePhone createMobilePhone(String type); public abstract Television createTelevision(String type); }
- 具体工厂类:实现抽象工厂的抽象方法生成产品
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class XiaoMiFactory:Factory { public override MobilePhone createMobilePhone(string type) { return new MobilePhone(type); } public override Television createTelevision(string type) { return new Television(type); } }
下面实际测试一下:
static void Main(string[] args) { Factory factory = Factory.getFactory("XiaoMiFactory"); IMobilePhone mobilePhone1 = factory.createMobilePhone("小米2"); IMobilePhone mobilePhone2 = factory.createMobilePhone("小米5"); ITelevision television1 = factory.createTelevision("小米电视2"); ITelevision television2 = factory.createTelevision("小米电视3"); mobilePhone1.dial(); mobilePhone2.dial(); television1.watchTV(); television2.watchTV(); Console.ReadKey(); }
输出信息:
-
- 制作手机小米2
- 制作手机小米5
- 制作电视小米电视2
- 制作电视小米电视3
- 使用小米2打电话
- 使用小米5打电话
- 通过小米电视2看电视
- 通过小米电视3看电视