简单工厂模式
简单工厂模式是工厂方法模式的衍生,实现起来较容易,也是一种创建型模式。
目录
一、简短概述
二、优缺点
三、使用过程
四、举例
一、简短概述
当有一堆相似的对象需要被创建时,可以使用一个简单工厂去管理如何创建它们,这样在我们需要创建某个对象时,把任务交给这个简单工厂即可。
主要包含两种角色:
- 简单工厂(单个对象):控制创建哪些对象的类
- 产品(多个对象):那些需要被创建(实例化)的类
通过示意图来体现在简单工厂模式下,这些类或对象之间的关系:(注:本图以运算器为例,比较直观,可以举一反三)
至于为什么产品要定义一个父类,是因为想要上述思想实现的有意义那么就必须这样做,你也将会在下面的例子中感受到。一句话:就是为了更好的利用面向对象语言的封装、继承、多态。
二、优缺点
1、顾名思义,简单工厂模式就是工厂方法模式的简易版本,如假定只有某一堆相似的对象需要经常被创建,这时就可以使用简单工厂模式;当然当有多种不同类别的对象要被创建时,那还是建议使用工厂方法模式或抽象工厂模式;2、对请求发起方来说,解除了创建对象的耦合,当需要改变具体要创建哪个对象时,只需要修改简单工厂即可;而且在Java中引入反射和配置文件等技术后,那么不需要修改代码,只需要修改配置文件就可以达到动态控制的目的了。
三、使用过程
步骤如下:
1、现实遇到的问题:
- 当我们需要大量创建一些同一类型的对象时(注:有时候也需要我们先去分析或抽象出那些想要被创建的对象是不是属于同一种类型)
2、针对问题的设计要素:
- 一个抽象类或接口:用来定义被创建对象的公共约束或超类(上一步骤归纳出的)
- 一个简单工厂:用来创建某一类型的对象
四、举例
4.1、实现一个计算器,分析步骤:
1、现实遇到的问题:
- 为了实现计算器,我们经常需要创建对象:如加法运算、减法运算、除法运算、乘法运算等。
1.1、思考发现:
加法、减法、除法、乘法等它们都可以归类为运算类。
2、针对问题的设计要素:
- 一个运算抽象类或接口(本例使用接口,加减乘除都实现它,至于为什么要定义一个父类,然后再子类继承或实现,你将会在下面代码中体会到之前文章提到的,使用设计模式的现实基础是封装、继承、多态)
- 一个专门创建运算对象的简单工厂
4.2、对象之间的关系用UML图表示如下:
4.3、Java实现代码如下(建议你在本地试一下,加深印象):
运算类接口(也可以根据需要为抽象类):
public interface Operation {
public double getResult(double num1, double num2);
}
加法类:
public class Add implements Operation {
@Override
public double getResult(double num1, double num2) {
return num1 + num2;
}
}
减法类:
public class Sub implements Operation {
@Override
public double getResult(double num1, double num2) {
return num1 - num2;
}
}
除法类:
public class Div implements Operation {
@Override
public double getResult(double num1, double num2) {
if (num2 == 0) {
throw new ArithmeticException("除数不能为零!");
}
return num1 / num2;
}
}
乘法类:
public class Mul implements Operation {
@Override
public double getResult(double num1, double num2) {
return num1 * num2;
}
}
简单工厂:(在这里我们可以看到为什么要定义运算接口,这样才可以用到多态)
public class OperationFactory {
//创建运算实例的方法
public Operation createOperate(String operate) {
Operation operation = null;
switch (operate) {
case "+":
operation = new Add(); //创建加法类
break;
case "-":
operation = new Sub(); //创建减法类
break;
case "*":
operation = new Mul(); //创建乘法类
break;
case "/":
operation = new Div(); //创建除法类
break;
}
return operation;
}
}
主程序(发起请求的类):
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入被运算数:");
double num1 = Double.parseDouble(scanner.nextLine());
System.out.print("请输入运算符号:");
String operate = scanner.nextLine();
System.out.print("请输入运算数:");
double num2 = Double.parseDouble(scanner.nextLine());
//使用工厂创建对应的运算实例
Operation operation = new OperationFactory().createOperate(operate);
//将运算数传给工厂已经创建的运算类,得到运算结果并输出
System.out.print("结果为:" + operation.getResult(num1, num2));
}
}
小说明:运算符号可输入,加+、减-、乘*、除/;运算数可以输入double类型数据。
就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。
在这里也推荐一本设计模式的入门书《大话设计模式》。