zoukankan      html  css  js  c++  java
  • 设计模式你怎么看?--工厂方法模式

    一 前言

      在设计模式中三种工厂模式前两种已经写完了,三种工厂模式都有一些细微的区别,这篇写的是最后一种工厂方法模式,在介绍它的同时,也会与其它两种的不同做一个对比

    前两篇在这里

    设计模式你怎么看?--简单工厂模式

    设计模式你怎么看?--抽象工厂模式

    二 工厂方法模式介绍

        2.1 什么是工厂方法模式

        定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品

      2.2  UML 类图

     

    2.3  工厂方法模式与抽象工厂模式的区别

       工厂方法通常只是创建一个产品等级如图中(Operation),而抽象工厂则是创建多个产品等级的,工厂方法模式只有一个方法,创建一种产品,而抽象工厂模式则多个方法,创建一系列的产品,2 工厂方法一般只有一个抽象产品类 (Operation) 而抽象工厂则有多个。以上的区别可以很清晰的从图中看出区别

        

    2.4  工厂方法模式与简单工厂模式的区别

       简单工厂模式将逻辑转移到了工厂类中,使得每新增一种产品时需要修改工厂类, 违背了开放-封闭原则 。而工厂方法的出现一定程序上解决了这种情况,定义了一个抽象类,让所有的子类都继承它,而且新增产品时只需要实现继承就行,并把逻辑转移到了客户端中

    三 工厂方法模式代码

     这次用常用的加减法例子吧

    定义工厂类接口

        public interface IFactory
        {
            Operation CreatInstance();
        }

     继承接口的减法工厂类

        class SubFactory:IFactory
        {
            public Operation CreatInstance()
            {
                return new SubOperation();
            }
        }

      继承接口的加法工厂类

        class AddFactory:IFactory
        {
            public Operation CreatInstance()
            {
                return new AddOperation();
            }
        }

     产品类接口

    public class Operation
        {
            public int Number1 { get; set; }
            public int Number2 { get; set; }
    
            public virtual int GetResult()
            {
                return Number1 + Number2;
            }
        }

     具体减法类

        class SubOperation:Operation
        {
            public override int GetResult()
            {
                return Number1 - Number2;
            }
        }

     具体加法类

        class AddOperation:Operation
        {
            public override int GetResult()
            {
                return base.GetResult();
            }
        }

     客户端类可以看出与简单工厂类不同的是工厂类中不再存在 Switch case的判断 因为每个具体的产品都对应了一个工厂类。

        class Program
        {
            static void Main(string[] args)
            {
                IFactory factory;
                factory = new AddFactory();
                var addInstance = factory.CreatInstance();
                addInstance.Number1 = 10;
                addInstance.Number2 = 20;
                int result = addInstance.GetResult();
                Console.WriteLine(string.Format("调用加法工厂计算结果 {0}
    ",result));
    
                factory = new SubFactory();
                var subInstance = factory.CreatInstance();
                subInstance.Number1 = 20;
                subInstance.Number2 = 10;
                result = subInstance.GetResult();
    
                Console.WriteLine(string.Format("调用减法工厂计算结果 {0}
    ", result));
    
                Console.Read();
    
            }
        }

     结果如下

     

    四 总结

       设计模式 如此精深,我努力在领悟。前些天 好友 @冰麟轻武 给我留言了一段很经典的话,很好的诠释了对于设计模式的理解

    设计模式就好比太极拳
    张三丰教张无忌的时候就问,记住了多少,全忘了就学会了

    设计模式的核心在于6大原则:单一职责,里氏替换,开放封闭,依赖倒转,接口隔离,迪米特法则
    就好比太极拳的八劲:掤,捋,挤,按,采,挒,肘,靠,
    重要的是灵活运用这八劲,互相组合,千变万化,见招拆招,才能以柔克刚,克敌制胜!
    如果死记套路,按套路出牌,你出第一拳的时候,别人马上就把你第二招劫杀了

    当然,所有的技巧都是建立的熟练套路的基础上的
    等到套路熟练了,就可以把他们忘掉了

    最跟风一下   "代码虽易,写好不易 且写且珍惜"

    本人水平有限,如有不对之处还请指出 谢谢~

    如果您觉得本文有给您带来一点收获,不妨点个推荐,为我的付出支持一下,谢谢~

    如果希望在技术的道路上能有更多的朋友,那就关注下我吧,让我们一起在技术的路上奔跑

      

  • 相关阅读:
    无锁队列的实现
    C/C++语言中闭包的探究及比较
    Linus:利用二级指针删除单向链表
    Unix考古记:一个“遗失”的shell
    “C++的数组不支持多态”?
    Alan Cox:单向链表中prev指针的妙用
    二叉树迭代器算法
    C语言全局变量那些事儿
    数据即代码:元驱动编程
    C++模板”>>”编译问题与词法消歧设计
  • 原文地址:https://www.cnblogs.com/zery/p/3637099.html
Copyright © 2011-2022 走看看