首页 > 技术文章 > 设计模式——简单工厂模式(不属于23种GOF模式)(代码实现)

java-spring 2020-05-29 17:18 原文

定义
利用了面向对象的封装、继承、多态、
属于创建型模式,又叫做静态工厂方法模式,但不属于23中GOF设计模式之一。是由一个对象决
定创建出哪一种产品类的实例。
类型:
创建型模式
简单工厂模式结构图
简单工厂模式结构解析
  • 抽象产品角色:简单工厂模式所创建的所有对象的父类,他负责描述所有实例所共有的公共接口。
  • 具体产品角色:简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实现。
  • 工厂角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用创建所需的产品对象。
抽象运算类/运算接口
/**
 * @Description: 创建抽象运算类或者运算接口
 * @Author: qjc
 * @Date: 2020/5/28
 */
public interface Operation {

    double getResult(Double numberA, Double numberB) throws Exception;

}

加法运算类

/**
 * @Description: 加法类
 * @Author: qjc
 * @Date: 2020/5/28
 */
public class OperationAdd implements Operation {

    @Override
    public double getResult(Double numberA, Double numberB) {
        return numberA + numberB;
    }

}

减法运算类

/**
 * @Description: 减法类
 * @Author: qjc
 * @Date: 2020/5/28
 */
public class OperationSub implements Operation {

    @Override
    public double getResult(Double numberA, Double numberB) {
        return numberA - numberB;
    }

}

乘法运算类

/**
 * @Description: 乘法类
 * @Author: qjc
 * @Date: 2020/5/28
 */
public class OperationMul implements Operation {

    @Override
    public double getResult(Double numberA, Double numberB) {
        return numberA * numberB;
    }

}

除法运算类

/**
 * @Description: 除法类
 * @Author: qjc
 * @Date: 2020/5/28
 */
public class OperationDiv implements Operation {

    @Override
    public double getResult(Double numberA, Double numberB) throws Exception {
        if (numberB == 0) {
            throw new Exception("除数不能为0");
        }
        return numberA / numberB;
    }

}

运算工厂类

/**
 * @Description: 运算工厂类,创建运算对象
 * @Author: qjc
 * @Date: 2020/5/28
 */
public class OperationFactory {

    public static Operation createOperation(String operate) {
        Operation operation = null;
        switch (operate) {
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
            default:
                break;
        }
        return operation;
    }

}

测试客户端

public class SimpleFactoryModeTest {

    public static void main(String[] args) throws Exception {
        Double numA = 100.;
        Double numB = 10.;

        Operation operation = OperationFactory.createOperation("/");
        double result = operation.getResult(numA, numB);
        System.err.println(result);
    }
}
简单工厂模式的优缺点
  • 优点:我们可以对创建的对象进行一些“加工”,而且外界并不知道,外界只需要进行使用“消费”对象就行了,不必管这些对象是如何创建的
  • 缺点:如果需要其他的对象,我们需要先创建对象,然后在工厂类中创建该对象,这个简单工厂类就会有很多对象创建,每次增加或者删除对象都会修改工厂类,最终导致简单工厂类很庞大臃肿、耦合性高,对系统的维护和扩展非常不利
 
 

推荐阅读