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

    总结:

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

  • 相关阅读:
    一文让你明白Redis持久化
    spring-data-redis 2.0 的使用
    中间自适应布局的5种解法
    php实现只需要一个QQ号就可以获得用户信息
    基于LINUX下的进程管理问题
    【初码干货】记一次分布式B站爬虫任务系统的完整设计和实施
    初码-爬虫系列-文章目录
    初码-阿里云系列-文章目录
    初码-Azure系列-存储队列的使用与一个Azure小工具(蓝天助手)
    初码-Azure系列-记一次MySQL数据库向Azure的迁移
  • 原文地址:https://www.cnblogs.com/tujietg/p/10278874.html
Copyright © 2011-2022 走看看