设计模式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()方法可以少写重复的次数,书上提到,类型的实例化可以根据反射来操作。可能我举的这个例子不合适吧,但工厂方法就是这样的,好了就这样。

posted @ 2019-01-10 15:40  RジP  阅读(113)  评论(0)    收藏  举报