小插曲
最近见XX同学也在学习设计模式,就问了她是如何学习的。
XX同学说:我先看了一遍课本然后,从大致意思上找他们之间的联系,通过
对比来进行学习。比如:我最近在学习简单工厂、工厂模式和抽象工厂。
听了之后,顿时觉得羞愧难当。一直在强调全局观,一直在强调对比学习,
而我呢?看了不到一半就稀里糊涂的开始敲了。哎,说好的全局观呢?说好的对比学习
呢?在此有必要在强调那句话:
不谋全局者,不足谋一域,不谋万世者,不足谋一时。
【仅以此献给正在奋斗的亲们!】
有关的简单工厂模式的总结,请点下面的链接。
http://blog.csdn.net/luckyzhoustar/article/details/20855463
定义
一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类
的实例化延迟到其子类。
类图
Product:定义工厂方法所创建的对象的接口。
Creator:声明工厂方法,该方法返回一个Product类型的对象。
ConcreteProduct:具体的产品,实现了Product接口。
ConcreteCreator:重定义工厂方法以返回一个ConcreteProduct实例。
看上图我们发现,工厂模式只不过比简单工厂模式更具体化,这也是“简单”
二字的含义。以前只需要一个工厂,通过Switch语句进行判断就可以生产出相应的产
品,而在工厂模式里面,又把大的工厂具体的细分为一些小的工厂,在这些小的工厂里
面来生产产品。
在现实生活中,我们知道,为何流水线作业效率比较高呢,主要在于分工作业的
精细化。而工厂模式也突出了这一点,通过一个大的工厂的抽象接口,然后衍生出许多
具体的小型工厂,那么这些在代码中又是如何来实现的呢?
【先看与简单工厂的区别部分】
//简单雷锋工厂 class SimpleFactory { public static LeiFeng CreateLeiFeng(string type) { LeiFeng result = null; switch (type) { case "学雷锋的大学生": result = new Undergraduate(); break; } return result; } } //雷锋工厂 interface IFactory { LeiFeng CreateLeiFeng(); } class UndergraduateFactory:IFactory { public LeiFeng CreateLeiFeng() { return new Undergraduate(); } } class volunteerFactory:IFactory { public LeiFeng CreateLeiFeng() { return new Volunteer(); } } }
而我们从上面的代码部分可以看出,在简单工厂模式中,是通过条件判断来生产产
品的,而在工厂模式中通过一个子类来实现一个接口来实现产品的生产。
亲们,可能明白是怎么回事了,但是不太清楚到底都有什么优缺点呢?请接着看。
static void Main(string[] args) { //简单工厂模式,在此需要一个一个的实例化大学生 LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生"); studentA.BuyRice(); LeiFeng studentB = SimpleFactory.CreateLeiFeng("学雷锋的大学生"); studentB.Sweep(); LeiFeng studentC = SimpleFactory.CreateLeiFeng("学雷锋的大学生"); studentC.Wash(); //工厂方法模式,在此间接的通过具体的工厂实现即可 IFactory factory = new UndergraduateFactory(); LeiFeng student = factory.CreateLeiFeng(); student.BuyRice(); student.Sweep(); student.Wash(); Console.Read(); }
从上述简单工厂模式中可以看出,每个人打着“学雷锋的大学生”的旗号的话,都
需要一次次的调用工厂,而在工厂模式中只需要一次性实例化,就可以赋予“学雷锋大
学生”的名义。
小结:
简单工厂模式
优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例
化相关的类。
工厂模式
把简单工厂中的内部逻辑判断移到了客户端代码来进行,克服了简单工厂违
背开放—封闭原则的特点,又保持了对象创建过程的优点。
原文:http://blog.csdn.net/luckyzhoustar/article/details/21329979