zoukankan      html  css  js  c++  java
  • 设计模式——工厂模式

    定义:

    定义一个接口,让创建对象延伸到子类,工厂方法让实例化延伸到子类。

    简单工厂VS工厂模式:

    简单工厂类最大的有点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件,动态的实例化相关的类,对于客户端来说,去除了与具体产品的实现。

    简单工厂类中,我们采用的是计算器的Demo,我们的计算器实现了加减乘除,如果这时,我们想给我们计算器增加一个开方的功能的,我们需要修改工厂类,这个时候,我们就违背了我们的设计原则开放封闭原则了。

    我们采取一个措施,把原来的工厂类,根据依赖倒转原则,抽象出来,成为一个接口。这个接口,不去关心如何创建对象,仅仅给实现的的子类提供必须要实现的功能。

    UML图:

    老规矩,代码中参悟。

    Demo:
    根据简单工厂模式的中的Demo的改版。

    Operation:

    public abstract class Operation {
        int FirstNum;
        int SecondNum;
    
        public int getFirstNum() {
            return FirstNum;
        }
    
        public void setFirstNum(int firstNum) {
            FirstNum = firstNum;
        }
    
        public int getSecondNum() {
            return SecondNum;
        }
    
        public void setSecondNum(int secondNum) {
            SecondNum = secondNum;
        }
    
        public abstract int getResult() throws Exception;
    }

    OperationImpl:

    //加法
    class OperationAddImpl extends Operation {
        @Override
        public int getResult() {
            return FirstNum + SecondNum;
        }
    
    }
    
    //除法
    class OperationDivImpl extends Operation {
        @Override
        public int getResult() throws Exception {
            if (SecondNum == 0) {
                throw new Exception("被除数不能为0");
            } else {
                return FirstNum / SecondNum;
            }
        }
    
    }
    
    //减法
    class OperationSubImpl extends Operation {
    
        @Override
        public int getResult() {
            return FirstNum - SecondNum;
        }
    
    }
    
    //乘法
    class OperationMulDivImpl extends Operation {
        @Override
        public int getResult() {
            return FirstNum * SecondNum;
        }
    
    }

    Factory:

    public interface Factory {
        public Operation create();
    }

    FactoryImpl:

    class FactoryAdd implements Factory {
        @Override
        public Operation create() {
            return new OperationAddImpl();
        }
    }
    
    class FactorySub implements Factory {
        @Override
        public Operation create() {
            return new OperationSubImpl();
        }
    }
    
    class FactoryMulDiv implements Factory {
        @Override
        public Operation create() {
            return new OperationMulDivImpl();
        }
    }
    
    class FactoryDiv implements Factory {
        @Override
        public Operation create() {
            return new OperationMulDivImpl();
        }
    }

    Client:

    public class Client {
        public static void main(String[] args) throws Exception {
            Factory factory = new FactoryAdd();
            Operation oper = factory.create();
            oper.setFirstNum(10);
            oper.setSecondNum(2);
            System.out.println(oper.getResult());
        }
    }

    总结:

    工厂模式是从简单工厂模式衍生出来的,解决了简单工厂模式存在一些问题,例如解决了简单工厂违反开放封闭原则的问题。

  • 相关阅读:
    你想要的是水还是杯子?
    有哪些违背“君子之风”的无知行为
    如何给无限级树添加大纲目录索引
    0的哲学:简化规则
    计算机中的不可解问题——停机问题
    java基于mongodb实现分布式锁
    开源基于docker的任务调度器pipeline,比`quartzs` 更强大的分布式任务调度器
    解决 VSCode 的模块导入别名问题
    hugegraph 源码解读 —— 索引与查询优化分析
    Java xss攻击拦截,Java CSRF跨站点伪造请求拦截
  • 原文地址:https://www.cnblogs.com/tujietg/p/10278874.html
Copyright © 2011-2022 走看看