zoukankan      html  css  js  c++  java
  • 设计模式一:简单工厂模式

    概念理解:
       1. 解耦:一般通过增加一些抽象层,来实现 功能提供者和功能使用者 两者的解耦隔离。而如果想要扩展功能即增加功能,只需要添加相应的相应的新的功能类,修改中间的抽象类即可,并不用修改使用者部分的代码。并且功能提供者的代码可以复用。而且使得程序更容易理解。

    简单工厂模式介绍
    一.什么是简单工厂模式?
            简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个子类(这些子类继承  自一个父类或接口)的实例。
    二.简单工厂模式包含的角色:
       1.工厂角色(工厂类): 它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
       2.抽象产品角色: 简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
       3.具体产品角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
    三.简单工厂模式的类图
            
    四.深入分析
        1.核心思想: 有一个专门的类来负责创建实例的过程。
        2. 优点:工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
       3.缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。 也就违背了“开放封闭原则”,就是违背了“系统对扩展开放,对修改关闭”的原则 (2)
       4. 总结一下:简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化;但是由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违 背了“开放封闭原则”。另外,简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,因此,简单工厂模式无法形成基于基类的继承树结构。
        5.使用场景:
         工厂类负责创建的对象比较少;
         客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
         由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
    五.代码
    题目:模拟计算器
     
    // 创建抽象产品类(父类)
    class Operate{
         int numA;
         int numB;
     
         public getNumA(){
              return numA;
         }
         
         public setNumA(int num){
              numA = num;
         }
     
         public getNumB(){
              return numB;
         }
         public setNumB(int num){
              numB = num;
         }
         
         public int getResult(){}
    }
     
    // 创建具体产品类
     
    class Add extends Operate{
         public int getResult(){
              return numA + numB;
         }
    }
     
    class Sub extends Operate {
          public int getResult(){
              return numA - numB;
         }
    }
     
    class Mul extends Opreate{
         public int getResult(){
              return numA * numB;
         }
    }
     
    class Div extends Opreate{
           public int getResult(){
              if(0 == numB){
                   System.out.println("除数不能为0");
                   return 0;     
              }
              return numA / numB;
         }
    }
     
     
    class OperateFactory{
        public static Operate createOperate(String operate){
              OPerate op = null;
              switch(operate){
                   case "+":{
                        op = new Add();
                   }break;
                   case "-":{
                        op = new Sub();
                   }break;
                   case "*":{
                        op = new Mul();
                   }break;
                   case "/":{
                        op = new DIV();
                   }break;
                   deafult:break;
              }
              return op;
         }     
    }
     
     
     
  • 相关阅读:
    iOS crash 追终 ,iOS 如何定位crash 位置
    ios 性能优化策略
    如何提升代码编译的速度 iOS
    关于iOS的runtime
    iOS __block 与 __weak
    spring-boot-framework 如何自动将对象返回成json格式
    spring-boot 热部署 intellij IDE(开发过程)
    MAVEN中的插件放在哪个dependcies里面
    css3 RGBA
    css3 loading 效果3
  • 原文地址:https://www.cnblogs.com/beijixingzhiguang/p/4319479.html
Copyright © 2011-2022 走看看