zoukankan      html  css  js  c++  java
  • 设计模式(1)---简单工厂模式

      引言:

      从接触编码到现在有一段时间了,总是在为一些基础语法、技能而不断学习,学着学着感觉有些茫然。在上一篇曾经说过一大牛的教诲:“c语言、java语言、C#语言这些都是一些基本的工具,而它们其中的语法、技能都是一些很简单的基础知识,刚接触编码时肯定会有很多的知识、技能你不懂,但你只要碰到并且学习肯定能够熟练使用。所以语言、技能都不重要,重要的是脱离语言工具的思想,编程的思想。设计模式是思想的体现,多多学习肯定没错”。这之后一直在看设计模式方面的书,但“纸上得来终觉浅,绝知此事要躬行”,于是想把看的书、评论、博客等一些东西总结到一块摘写出来,加深印象同时方便学习。现在开始第一篇:简单工厂模式。

      定义:

      定义一个类专门负责创建其他类的实例,具体创建什么实例由传入的参数而决定,并且这些类都共同继承于一个父类或者有共同的接口。简单工厂模式是工厂模式家族中最简单的一种实用模式,也可以说是不同工厂模式的一个特殊实现。

      简单工厂符合面向对象重要原则之一:封装改变。

      参与者:

      工厂角色Creator:模式的核心,负责创建所有实例,根据传入的参数,决定创建什么类型的实例。

      抽象产品角色Product:上述所有类的父类或者是接口。

      具体产品角色Concrete Product:由工厂类创建出来的具体的产品实例。

      UML图:

      

      举例说明:

      列举大话设计模式中的一个计数器例子,制作一个计数器,进行加减乘除运算。

      

      抽象产品角色:父类(运算类) 

    public class Operation
        {
            private double numberA = 0;
            private double numberB = 0;
    
            public double NumberA
            {
                get { return numberA; }
                set { numberA = value; }
            }
    
            public double NumberB
            {
                get { return numberB; }
                set { numberB = value; }
            }
    
            public virtual double GetResult()
            {
                double result = 0;
                return result;
            }
        }

      

      具体产品角色:子类(加减乘除) 

    class OperationAdd : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA + NumberB;
                return result;
            }
        }
    
        class OperationSub : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA - NumberB;
                return result;
            }
        }
    
        class OperationMul : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumberA * NumberB;
                return result;
            }
        }
    
        class OperationDiv : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                if (NumberB == 0)
                {
                    throw new Exception("除数不能为0");
                }
                result = NumberA / NumberB;
                return result;
            }
        }

      工厂角色:建造各种实例

    public class OperationFactory
        {
            public static Operation CreateOperate(string operate)
            {
                Operation operation = null;
    
                switch (operate)
                { 
                    case "+":
                        operation = new OperationAdd();
                        break;
                    case "-":
                        operation = new OperationSub();
                        break;
                    case "*":
                        operation = new OperationMul();
                        break;
                    case "/":
                        operation = new OperationDiv();
                        break;
                }
    
                return operation;
            }
        }

      客户端调用: 

    static void Main(string[] args)
            {
                Operation operation;
                operation = OperationFactory.CreateOperate("-");
                operation.NumberA = 3;
                operation.NumberB = 7;
                double result = operation.GetResult();
                Console.WriteLine(result);
    
                Console.ReadLine();
            }

      

      到此,一个简单的计数器实例编写完毕。客户端向工厂类传入参数“-”,工厂类根据传入的参数创建具体的产品实例,然后进行运算。

      简单工厂模式优点:

      简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。  低耦合,与外界具体产品类分开。

      实现代码复用。

      缺点:

      违反了高内聚的原则,直接导致:如果需要创建新的类,也就必须改变工厂类

      

      适用场合:

      适用于创建的对象比较少的情况;

      适用于客户端只负责传入参数而不关心创建实例的内部逻辑。

    补充:

      看的设计模式第一个就是简单工厂模式,但是实际项目中一直没有用,前几天一个同事为了解决项目问题用了简单工厂模式,事后跟他一讨论才知道,那哥们比较牛,没有看过设计模式,就是根据自己的想象写出一个小架构,符合简单工厂模式。此处只是为了加速对简单工厂模式的理解,大致讲解该项目的系统框架。

    该项目是:为了集合多厂商产品SDK而开发出来的一套产品,目前仅有A和B厂商的SDK。编写简单框架,满足扩展要求,实现产品功能。

    首先编写一个接口类:

    interface IMethod
    {
       void method1();
       void method2();      
    }

    其次是A和B厂商都继承IMethod接口:

    class A:IMethod
    {
      void method1()
      {
         //user ASDK       
       }  
    
       void method2()
      {
         //user ASDK       
       }      
    }
    
    class B:IMethod
    {
      void method1()
      {
         //user BSDK       
       }  
    
       void method2()
      {
         //user BSDK       
       }  
    }

    工厂类,即决定调用什么方法:

    class Factory
    {
        public char factorySDK;
    
        public Factory(char factorySDK)
        {
             this.factorySDK = factorySDK;
        }  
    
        public IMethod  CreateSDK(char factorySDK)
        {
               IMethod method = null;
                switch(factorySDK)
                {
                         case ASDK:
                                method = new  A();
                                 break;
                           case BSDK:
                                method = new  B();
                                 break;
                          default:
                                   break;
                }
                return method;
        }  

      public void Method1()
      {
        method.Method1();
      }

      
      public void Method2()
      {
        method.Method2();
      }

    }

      如果下次需要把C厂商产品的SDK也集中进去,如果没有新的需求,那么便不需要增加新的方法,只需要建造一个C类,继承IMethod接口。同时在工厂类中新增一个new C即可。通过此项目,从理论方面学习设计模式进入到实际的项目实践中去,虽然是看到别人写的,但最自己也是一个不小的收获。

  • 相关阅读:
    移动端开发必须知道的小技巧
    前端程序员被聘用的13个开发技能
    AIOps产品与架构浅析【华为云技术分享】
    su和sudo的区别与使用【华为云技术分享】
    为什么我不喜欢数据库三范式【华为云技术分享】
    python推导式pythonic必备【华为云技术分享】
    理解递归与动态规划【华为云技术分享】
    Spring Boot 最流行的 16 条实践解读!【华为云技术分享】
    机器学习笔记(六) ---- 支持向量机(SVM)【华为云技术分享】
    独立物理机和虚拟机比较有什么优势?【华为云技术分享】
  • 原文地址:https://www.cnblogs.com/ysyn/p/3621824.html
Copyright © 2011-2022 走看看