【大话设计模式】—— 工厂方法方式

【大话设计模式】—— 工厂方法模式

一、概念

  想象一下我们的平常见到的工厂,下一个订单,付了订金,一段时间后就可以提货。我们不需要知道工厂是用的什么机器,怎么安排工人的,从哪来的材料,仅仅需要一个订单就好,工厂就可以按照其固定流水线做出我们所需要的产品。设计模式中也有类似的一个大神:工厂方法模式。

  下面让我们来认识一下:

  工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

  

二、UML图

Product(抽象产品)

ConcreteProduct(具体产品)

Creator(抽象工厂)

ConcreteCreator(具体工厂)

【大话设计模式】—— 工厂方法方式



三、实例解析

  首先有一个大学生,以学雷锋的名义去帮助老人做事。

  雷锋类,拥有扫地、洗衣、买米等方法,大学生和志愿者继承雷锋的光荣传统,拥有父类雷锋类的 扫地、洗衣、买米等方法。创建一个总的雷锋工厂接口用于创建对象,让子类学雷锋的大学生工厂 和社区志愿者工厂决定实例化哪个类。

【大话设计模式】—— 工厂方法方式

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)

        {
            IFactory factory = new UndergraduateFactory();
            LeiFeng student = factory.CreateLeiFeng();

            student.BuyRice();
            student.Sweep();
            student.Wash();
        }
    }

    //雷锋
    class LeiFeng
    {
        public void Sweep()
        {
            Console.WriteLine("扫地");
        }
        public void Wash()
        {
            Console.WriteLine("洗衣");
        }
        public void BuyRice()
        {
            Console.WriteLine("买米");
        }
    }
    //学雷锋的大学生
    class Undergraduate : LeiFeng
    { }

    //学雷锋的志愿者
    class Volunteer : LeiFeng
    { }

    
    //雷锋工厂
    interface IFactory
    {
        LeiFeng CreateLeiFeng();
    }

    //学雷锋的大学生工厂
    class UndergraduateFactory : IFactory
    {
        public LeiFeng CreateLeiFeng()
        {
            return new Undergraduate();
        }
    }

    //学雷锋的社区志愿者工厂
    class VolunteerFactory : IFactory
    {
        public LeiFeng CreateLeiFeng()
        {
            return new Volunteer();
        }
    }
 
}

结果:

【大话设计模式】—— 工厂方法方式

四、总结

  简单工厂模式解决了对象的创建问题,它把所有的细节判断都一股脑的扔给了工厂。工厂包含了必要的逻辑判断,能够根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。凡事都有相对性,有利有弊。添加是方便了,但是后期维护和扩展都需要修改工厂,违背了开闭原则。

  策略模式,封装了算法,减少了各种算法类与使用算法类之间的耦合,但是将判断放入了客户端,无形之间给客户端增加了压力。简单工厂和策略两者一结合,把判断隔离出来,单放一个类,就挺好的了。

  工厂方法模式是简单工厂模式的进一步抽象和推广。它是针对修改工厂这一弊端而诞生出来的。当我们再添加一个算法的时候,不需要修改原有工厂类,只需要添加此功能的运算类和相应的工厂类就可以了。克服了开闭原则,又保持了封装对象创建过程的优点。凡事过犹不及,如果增加的产品多了,增加的产品工厂类就增多,额外开发量是很大的。

 

五、感受

  学设计模式,就好像一个公司:有一个大boss(客户端),负责接收和处理系统事件。大boss安排几个专业人士(类),能够完成各自擅长领域的工作(高内聚),但是他们不仅仅要学会各司其职,也要学会合作(耦合)。为了避免这么多人都一块讨论,效率低下,就出现了各个部门(多态,抽象类),降低了办公室恋情的概率。。。(低耦合),提高了办事效率。

  每个设计模式跟人一样都不是十全十美的,只有大家分工合作,才能做到手中无剑,心中无剑的境界。


Ps:期待大家指点O(∩_∩)O~