首先在开篇需要提出一下,简单工厂模式并不属于23种设计模式的其中一种。
简单工厂模式,属于创建型模式,也叫做静态工厂方法模式。由一个工厂对象决定创建出哪一种产品的实例。
一、介绍
定义一个创建对象的工厂类,根据传入参数来自己决定实例化哪一个产品类。
简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。
二、何时使用
1、我们明确地计划不同条件下创建不同实例时。
2、创建的对象比较少,这样不会造成工厂方法中业务逻辑过于复杂。
3、调用者不需要关心对象的创建,只需要知道传入给定参数,返回相关数据即可
三、优点
1、调用者可以避免直接创建产品对象,甚至不需要关系了解创建的相关细节,这样的责任分割,有利于调用者更加专注处理业务逻辑,一切产品对象的需求,都可以交给工厂类来实现。
2、调用者不需要知道产品类的名称,只要传递相关参数即可。
3、在添加新的产品类时,不需要修改调用者的逻辑代码,提高了灵活性。
四、缺点
1、过分依赖工厂类,若工厂类中出现问题,则可能导致整个系统受到影响。
2、当新增一个产品时,需要想对应的修改工厂类,相对不利于扩展。
-------------------------------------------------------------------我是华丽的分割线-------------------------------------------------------------------
说了这么多概念性的东西,相信大家还是比较模糊,毕竟没有代码的技术博客是不完整的。
接下来,就让我们用代码来实现一下简单工厂设计模式。
让我们设计一个场景,做一个计算器,实现加减乘除,利用简单工厂设计模式。
按照我们上面所说,简单工厂设计模式里面,需要有工厂类和产品类,在这里,我们加、减、乘、除分别是一个完整的产品,并且他们还有共性,都有两个数字参与运算。根据这样的分析,我们可以画出UML图(这个图在关系上花的有一些问题,画图软件不好用,找不到需要的关联箭头,我之后再找找,有合适的画图软件后,会更新一下这个图)。
根据上面的UML图,我们可以很清晰的看到结构。
接下来,就是放大招的时候了
-------------------------------------------上代码-------------------------------------------
来看看Operation类怎么写
public class Operation {
private double numberA;
private double numberB;
public Operation() {
}
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public double getResult() {
double result = 0;
return result;
}
接下来就是加减乘除四兄弟了,其实套路是一样的
public class OperationAdd extends Operation {
@Override
public double getResult() {
return getNumberA() + getNumberB();
}
}
public class OperationSub extends Operation {
@Override
public double getResult() {
return getNumberA() - getNumberB();
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
return getNumberA() * getNumberB();
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() {
if (getNumberB() == 0) {
throw new NumberFormatException("numberB 不能为 0");
}
return getNumberA() / getNumberB();
}
}
在这里注意一下,除法运算,我们需要检验除数是否为0,所以在进行运算前,我进行一个判断。
接着我们看看这个工厂类要如何写
public class OperationFactory {
public static Operation createOperation(String operation) {
Operation opera = null;
switch (operation) {
case "+":
opera = new OperationAdd();
break;
case "-":
opera = new OperationSub();
break;
case "*":
opera = new OperationMul();
break;
case "/":
opera = new OperationDiv();
break;
default:
break;
}
return opera;
}
}
好,至此,我们这个小demo就已经写好了,接下来就是调用者的问题了,谁来调用,我们可以是可视化界面,也可以是命令行界面,当然也可以像我偷懒一样,凑合测试,哈哈哈哈哈哈哈~~~~~~~展示一下,调用流程
public class Demo {
public static void main(String[] args) {
Operation operation = OperationFactory.createOperation("/");
operation.setNumberA(2);
operation.setNumberB(1);
System.out.println(operation.getResult());
}
}
代码其实so easy~~~