我看了不少的帖子,设计模式几乎是园子里的月经贴,每隔一段时间总有人来分享一下本身的学习心得,或为记录本身所学,或为换着方式分享与你们。但大多直接上来就是给代码,给UML图,给类图,其实这种是快,但不少工做经验少的同窗,几乎没法体会其中的所含的内容,更没法在平常工做中运用所学,提高系统框架,功能的设计开发能力。设计模式
我但愿能经过足够简单的文字,让你们去体会到前人们所总结出来的设计模式框架
世间本无设计模式,用的人多了,天然就有了iphone
前面两张根据渐进明细的原则,逐步的从简单工厂模式走到工厂模式,今天介绍工厂的终极形态,抽象工厂ide
不要被终极形态所迷惑,我只是为了增长层层递进的效果学习
抽象工厂模式(Abstract Factory Pattern),提供一个建立一系列相关或相互依赖的接口,而无需指定它们具体的类spa
我就问还有谁,还有谁能第一眼看明白,理解透彻,知道是什么意思,站出来,算你输设计
老规矩,看黑板,画重点3d
2个点code
1.抽象,工厂, 这是一个动宾结果,抽象是动词,干吗呢,抽象->工厂,对工厂进行抽象,咱们对类进行抽象能够获得抽象类,抽象类什么概念??blog
看上去不一样,可是本质上相同的具体概念的抽象,咱们称为抽象类
你能够认为抽象类是一个超级基类
那同理
抽象工厂,咱们用形容词+名词结构来解释,抽象的工厂,那就是一个超级工厂。
超级工厂就是其余工厂的工厂,围绕超级工厂建立其余工厂
2.无需制定它们具体的类
咱们的工厂负责生产具体的东西,不须要显示的告诉他们,你须要生产什么什么,你只须要按照咱们超级工厂告诉你的作法去作,你生产出来的东西,就是咱们要的东西
咱们要的东西,超级工厂里已经告诉你了,等下请细细品味超级工厂,慢慢的体会这句话
咱们举个例子
Iphone,如今这个星球上人人都不陌生的手机,那Iphone其实还分32G 啦,64G啦等等型号的
在这个星球上,富士康是总所周知的苹果生产主力厂商,注意,是主力,不是所有
咱们假设,富士康的竞争对手比亚迪,也能生产Iphone
那苹果公司就会想了,我得分散,我不能所有交给富士康去生产,若是富士康要提价,我尚未其余选择么,我能够选择比亚迪来制衡富士康
基于这样一个案例,咱们看看怎么用抽象工厂模式来实现
咱们有IPhone,而且有各类不一样型号的IPhone
/// <summary> /// 我是IPhone 抽象类 /// </summary> public abstract class IPhone { /// <summary> /// 生产厂商名称 /// </summary> public abstract string FactoryName { get; set; } /// <summary> /// 手机的说明书 /// </summary> public abstract void Instructions(); } /// <summary> /// 64G的 IPhone /// </summary> public class IPhone64G : IPhone { public override string FactoryName { get; set; } public override void Instructions() { Console.WriteLine("我是64G的IPhone,我被" + FactoryName + "制造出来了"); } } /// <summary> /// 32G的 IPhone /// </summary> public class IPhone32G : IPhone { public override string FactoryName { get; set; } public override void Instructions() { Console.WriteLine("我是32G的IPhone,我被" + FactoryName + "制造出来了"); } }
而后咱们来建立一个超级工厂
/// <summary> /// 超级工厂 /// </summary> public interface IFactory { /// <summary> /// 请生产64位IPhone /// </summary> /// <returns></returns> IPhone64G CreatePhone64G(); /// <summary> /// 请生产32位IPhone /// </summary> /// <returns></returns> IPhone32G CreatePhone32G(); }
而后咱们分别建立富士康和比亚迪
富士康
/// <summary> /// 富士康 /// </summary> public class FoxconnFactory : IFactory { private string FactoryName = "Foxconn"; /// <summary> /// 生产64位IPhone /// </summary> /// <returns></returns> public IPhone64G CreatePhone64G() { var iphone64G = new IPhone64G() { FactoryName = FactoryName }; return iphone64G; } /// <summary> /// 生产32位IPhone /// </summary> /// <returns></returns> public IPhone32G CreatePhone32G() { var iphone32G = new IPhone32G() { FactoryName = FactoryName }; return iphone32G; } }
比亚迪
/// <summary> /// 比亚迪 /// </summary> public class BydFactory : IFactory { private string FactoryName = "BYD"; /// <summary> /// 生产64位IPhone /// </summary> /// <returns></returns> public IPhone64G CreatePhone64G() { var iphone64G = new IPhone64G() { FactoryName = FactoryName }; return iphone64G; } /// <summary> /// 生产32位IPhone /// </summary> /// <returns></returns> public IPhone32G CreatePhone32G() { var iphone32G = new IPhone32G() { FactoryName = FactoryName }; return iphone32G; } }
以上,咱们的抽象工厂模式就完成了,咱们来看看怎么调用
static void Main() { IFactory factory = new FoxconnFactory(); var iphone64G = factory.CreatePhone64G(); iphone64G.Instructions(); var iphone32G = factory.CreatePhone32G(); iphone32G.Instructions(); IFactory factory2 = new BydFactory(); var iphone64G2 = factory2.CreatePhone64G(); iphone64G2.Instructions(); var iphone32G2 = factory2.CreatePhone32G(); iphone32G2.Instructions(); Console.ReadLine(); }
结果以下
总结下
优势
1.咱们有超级工厂,咱们隔离了具体类的生产
2.既然有1,那咱们就容易改变产品的系列,后续要增长IPhone128G, IPhone7,8,9就很容易
缺点
增长产品的时候虽说咱们很容易,可是别忘记了,咱们须要修改超级工厂的定义,同时还要在具体的工厂里面加代码
不要沉迷与怎么把代码修改成抽象工厂模式,理解其为何,是什么,最后去想怎么用
以上就是关于抽象工厂设计模式的分享