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());
        }
    }

    总结:

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

  • 相关阅读:
    vue 封装 全局弹窗 js-dom
    vue 封装时间戳 用过滤方法封装
    前端上传img 并且添加水印
    原生ajax 封装
    vue filters 过滤用法 时间戳方法
    node+mysql+vue 搭建前后端分离基础框架
    基于jq div拉拽功能
    进程间通信方式+线程间通信方式
    只能生成栈对象和只能生成堆对象
    linux的基础命令行和shell的区别
  • 原文地址:https://www.cnblogs.com/tujietg/p/10278874.html
Copyright © 2011-2022 走看看