设计模式2-工厂方法
这个开头该怎么写呢?这样吧:今天,让我来记录一下设计模式之工厂方法的学习笔记。
工厂方法模式,与简单工厂模式同样带有“工厂“二字,所以在学习过程了对比两者的异同能够加深对两种模式的理解(当然了,后面还有个抽象工厂模式,那时候就得比较三者的异同了)。回顾一下简单工厂模式:将具体类向上抽象出抽象类,将具体类的实现放在工厂类中,工厂根据不同需要返回具体类的实例。那么工厂方法模式又是怎么回事呢?现在我们以简单工厂为例,来进行工厂方法的介绍。
在简单工厂模式下,我们需要添加新的类实例,我们会怎么做呢:在工厂类中继续加入if语句或者Case分支判断,用来返回新的类实例。这样有什么影响呢,我觉得除了判断语句过多,代码上不好看之外好像也没什么影响。其实不然,这种方式违背了开闭原则(对扩展开放,对修改关闭)。那怎么才能不违背开闭原则呢。这就用到了工厂方法模式了:在具体工厂上继续抽象出一抽象工厂,我们还是以开始的动物为例说明。原来的动物工厂升级为抽象动物工厂,工厂里面的分支语句独立成为具体动物工厂(如:猫工厂 产生猫的实例,狗工厂产生狗的实例等等等等);代码如下:
/// <summary> /// 抽象工厂 /// </summary> public abstract class AbstractFactory { //抽象方法 public abstract Animal GetAnimal(); } /// <summary> /// 狗工厂 /// </summary> public class DogFactory : AbstractFactory { public override Animal GetAnimal() { return new Dog(); } } /// <summary> /// 猫工厂 /// </summary> public class CatFactory : AbstractFactory { public override Animal GetAnimal() { return new Cat(); } }
主程序修改:
1 /// <summary> 2 /// 执行程序 3 /// </summary> 4 /// <param name="args"></param> 5 static void Main(string[] args) 6 { 7 var input= Console.ReadLine(); 8 AbstractFactory factory=null; 9 if (input == "猫") 10 { 11 factory = new CatFactory(); 12 } 13 if (input == "狗") 14 { 15 factory = new DogFactory(); 16 } 17 if (factory != null) 18 { 19 Animal animal = factory.GetAnimal(); 20 animal.Call(); 21 } 22 23 24 Console.ReadKey(); 25 }
那么,问题来了:这好像和直接实例化猫类,狗类没啥区别了呀,如果动物类足够多的话,倒是Call()方法可以少写重复的次数,书上提到,类型的实例化可以根据反射来操作。可能我举的这个例子不合适吧,但工厂方法就是这样的,好了就这样。

浙公网安备 33010602011771号