zoukankan      html  css  js  c++  java
  • 工厂模式三部曲之简单工厂模式

    今天,我们来谈一谈工厂模式三部曲之一——简单工厂模式(静态工厂模式)。
    首先,先谈一下工厂模式吧,工厂模式根据抽象程度的不同划分为三种:简单工厂模式,工厂方法模式以及抽象工厂模式。它是编程中经常用到的一种模式哦。那么为什么这么受欢迎呢?
    1.可以使代码清晰,有效地封装变化。通过工厂模式将产品的实例化封装起来,调用者无需关心产品的实例化过程,只需要依赖工厂即可得到自己想要的产品。
    2.降低耦合度。产品类的实例化通常需要依赖很多的类,而这些类对于调用者来说根本无需知道,使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对于调用者来说,产品所依赖的类都是透明的。

    3.对调用者屏蔽具体的产品类。调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何的影响。


    简单工厂模式,一般具有三个要素,工厂类,产品接口和产品的实现
    下面以简单的计算器案例加以说明。

    类图如下:

    项目目录如下:

    三个要素,工厂类是OperationFactory,负责创建产品对象。产品接口是Operation,里面定义了getResult()方法。AddOperation,SubOperation,MulOperation,DivOperation分别是产品的具体实现。代码如下:

    Operation:

    public abstract class Operation {
        private double number1;
        private double number2;
        public double getNumber1() {
            return number1;
        }
        public void setNumber1(double number1) {
            this.number1 = number1;
        }
        public double getNumber2() {
            return number2;
        }
        public void setNumber2(double number2) {
            this.number2 = number2;
        }
        public abstract double getResult();
    }

    AddOperation:

    public class AddOperation extends Operation {
    
        @Override
        public double getResult() {
            return getNumber1() + getNumber2();
        }
    
    }

    SubOperation:

    public class SubOperation extends Operation {
    
        @Override
        public double getResult() {
            return getNumber1() - getNumber2();
        }
    
    }

    MulOperation:

    public class MulOperation extends Operation {
    
        @Override
        public double getResult() {
            return getNumber1() * getNumber2();
        }
    
    }

    DivOperation:

    public class DivOperation extends Operation {
    
        @Override
        public double getResult() {
            if("0".equals(getNumber2()+"")){
                throw new RuntimeException("除数不能为0");
            }
            return getNumber1() / getNumber2();
        }
    
    }

    OpertionFactory:

    public class OperationFactory {
        public static Operation createOperation(String op){
            Operation oper = null;
            switch (op) {
            case "+":
                oper = new AddOperation();
                break;
            case "-":
                oper = new SubOperation();
                break;
            case "*":
                oper = new MulOperation();
                break;
            case "/":
                oper = new DivOperation();
                break;
    
            default:
                oper = null;
            }
            return oper;
        }
    }

     测试:

    Operation oper = OperationFactory.createOperation("-");
    oper.setNumber1(1);
    oper.setNumber2(3.5);
    System.out.println(oper.getResult());
  • 相关阅读:
    开源的web截图程序
    android开发 锁屏 真正的锁屏,是go锁屏那种。
    如何深拷贝一个对象数组?
    POJ1953 World Cup Noise
    DYD token “ 我们致力于让任何区块链资产可以立即花费 ”
    docker 从服务到pull镜像
    valheim:英灵神殿 关于1核2G内存服务器的搭建优化问题
    valheim:英灵神殿 服务器更新步骤
    valheim:英灵神殿 突破服务器人数上限
    Valheim:英灵神殿 服务器各种问题解答
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/5661356.html
Copyright © 2011-2022 走看看