抽象工厂模式:提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类
抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么。这样客户就可以从具体产品中被解耦。
抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展,这真是抽象工厂模式的优点所在,然后抽象模式同时也存在不足的地方。下面就具体看下抽象工厂的缺点(缺点其实在前面的介绍中以已经涉及了):
抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
知道了抽象工厂的优缺点之后,也就能很好地把握什么情况下考虑使用抽象工厂模式了,下面就具体看看使用抽象工厂模式的系统应该符合那几个前提:
- 一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
- 这个系统有多个系列产品,而系统中只消费其中某一系列产品
- 系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
1 ///抽象工厂类,提供创建不同商品的接口 2 public abstract class AbstractFactory 3 { 4 /// <summary> 5 /// 生产轮胎 6 /// </summary> 7 /// <returns></returns> 8 public abstract Tyre CreateTyre(); 9 10 /// <summary> 11 /// 生产离合器 12 /// </summary> 13 /// <returns></returns> 14 public abstract Clutch CreateClutch(); 15 } 16 17 /// <summary> 18 /// 轮胎抽象类 19 /// </summary> 20 public abstract class Tyre 21 { 22 /// <summary> 23 /// 打印方法,用于输出信息 24 /// </summary> 25 public abstract void Print(); 26 } 27 28 /// <summary> 29 /// 离合器抽象类 30 /// </summary> 31 public abstract class Clutch 32 { 33 /// <summary> 34 /// 打印方法,用于输出信息 35 /// </summary> 36 public abstract void Print(); 37 } 38 39 /// <summary> 40 /// DQ380生产工厂 41 /// </summary> 42 public class DQ380Factory:AbstractFactory 43 { 44 //离合器 45 public override Clutch CreateClutch() 46 { 47 return new DQ380Clutch(); 48 } 49 50 //轮胎 51 public override Tyre CreateTyre() 52 { 53 return new DQ380Tyre(); 54 } 55 } 56 57 /// <summary> 58 /// DQ500生产工厂 59 /// </summary> 60 public class DQ500Factory:AbstractFactory 61 { 62 public override Clutch CreateClutch() 63 { 64 return new DQ500Clutch(); 65 } 66 67 public override Tyre CreateTyre() 68 { 69 return new DQ500Tyre(); 70 } 71 } 72 73 /// <summary> 74 /// DQ380离合器 75 /// </summary> 76 public class DQ380Clutch:Clutch 77 { 78 public override void Print() 79 { 80 Console.WriteLine("DQ380离合器"); 81 } 82 } 83 84 /// <summary> 85 /// DQ500离合器 86 /// </summary> 87 public class DQ500Clutch:Clutch 88 { 89 public override void Print() 90 { 91 Console.WriteLine("DQ500离合器"); 92 } 93 } 94 95 /// <summary> 96 /// DQ380配套轮胎 97 /// </summary> 98 public class DQ380Tyre:Tyre 99 { 100 public override void Print() 101 { 102 Console.WriteLine("DQ380配套轮胎"); 103 } 104 } 105 106 /// <summary> 107 /// DQ500配套轮胎 108 /// </summary> 109 public class DQ500Tyre:Tyre 110 { 111 public override void Print() 112 { 113 Console.WriteLine("DQ500配套轮胎"); 114 } 115 } 116 117 }
客户端
Console.WriteLine("【抽象工厂模式】"); Console.WriteLine(); Console.WriteLine("DQ380工厂:"); Console.WriteLine(); AbstractFactory dq380Factory = new DQ380Factory(); dq380Factory.CreateClutch().Print(); dq380Factory.CreateTyre().Print(); Console.WriteLine(); Console.WriteLine(); Console.WriteLine("DQ500工厂:"); Console.WriteLine(); AbstractFactory dq500Factory = new DQ500Factory(); dq500Factory.CreateClutch().Print(); dq500Factory.CreateTyre().Print(); Console.ReadLine();