简单工厂模式: 简单工厂模式的工厂类随着产品类的增加需要增加额外的代码
工厂方法模式: 工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性 但是在实际应用中,一个工厂不止会创建单一的产品,因为现在的工厂都多元化了,一个工厂创建一系列的产品,这就引入了抽象工厂的概念。
抽象工厂模式 : 抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
区别
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
实例: 在一个生产显示屏幕和手机的工厂中,不同的流水线生产的产品不同。有的流水线生产显示器,有的生产手机。而且每条线上生产的显示器和手机品牌也不一样。下面用代码实现
AbstractFactory抽象工厂类
1 public abstract class AbstractFactorys 2 { 3 /// <summary> 4 /// 获取屏幕产品 5 /// </summary> 6 /// <returns></returns> 7 public abstract Screen screen(); 8 /// <summary> 9 /// 获取手机产品 10 /// </summary> 11 /// <returns></returns> 12 public abstract Mobile Mobile(); 13 }
显示器屏幕抽象类和手机抽象类(可以理解为手机流水线和显示器流水线)
1 /// <summary> 2 /// 屏幕抽象类 3 /// </summary> 4 public abstract class Screen 5 { 6 public abstract void DisplayScreen(); 7 }
1 /// <summary> 2 /// 手机抽象类 3 /// </summary> 4 public abstract class Mobile 5 { 6 public abstract void DisplayMobile(); 7 }
生产的LG品牌的手机和屏幕
1 /// <summary> 2 /// LG 手机类输出 3 /// </summary> 4 public class _LGPhone : Mobile 5 { 6 public override void DisplayMobile() 7 { 8 Console.WriteLine("生产LG手机"); 9 } 10 }
1 /// <summary> 2 /// LG屏幕输出 3 /// </summary> 4 public class _LGScreen : Screen 5 { 6 public override void DisplayScreen() 7 { 8 Console.WriteLine("生产LG屏幕"); 9 } 10 }
生产的三星(Samsung)品牌的手机和屏幕
1 /// <summary> 2 /// 三星手机输出 3 /// </summary> 4 public class _SamsungPhone : Mobile 5 { 6 public override void DisplayMobile() 7 { 8 Console.WriteLine("生产三星手机"); 9 } 10 }
1 /// <summary> 2 /// 三星屏幕输出 3 /// </summary> 4 public class _SamsungScreen : Screen 5 { 6 public override void DisplayScreen() 7 { 8 Console.WriteLine("生产三星屏幕"); 9 } 10 }
通过LG实例工厂得到LG品牌手机和显示器的实例
/// <summary> /// LG生产工厂 /// </summary> public class LGFactory : AbstractFactorys { /// <summary> /// 获取LG生产的手机 /// </summary> /// <returns></returns> public override Mobile Mobile() { return new _LGPhone(); } /// <summary> /// 获取LG生产的屏幕 /// </summary> /// <returns></returns> public override Screen screen() { return new _LGScreen(); } }
通过三星(Samsung)实例工厂得到LG品牌手机和显示器的实例
/// <summary> /// 三星实例工厂 /// </summary> public class SamsungFactory : AbstractFactorys { /// <summary> /// 三星生产的手机 /// </summary> /// <returns></returns> public override Mobile Mobile() { return new _SamsungPhone(); } /// <summary> /// 三星生产的屏幕 /// </summary> /// <returns></returns> public override Screen screen() { return new _SamsungScreen(); } }
测试输出:
class Program { static void Main(string[] args) { //输出三星的产品 AbstractFactorys samsung = new SamsungFactory(); Mobile _samsungMobile = samsung.Mobile(); Screen _samsungScreen = samsung.screen(); _samsungMobile.DisplayMobile(); _samsungScreen.DisplayScreen(); //输出LG的产品 AbstractFactorys lg = new LGFactory(); Mobile _lgMobile = lg.Mobile(); Screen _lgScreen = lg.screen(); _lgMobile.DisplayMobile(); _lgScreen.DisplayScreen(); Console.ReadKey(); } }