简单工厂模式动机与定义

在实际的软件开发过程中,有时需要创建一些来自于相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,可以通过传入不同的参数来获得不同的对象,这个就是最简单的设计模式之一简单工厂模式

举个例子

现在要写一个计算器程序,实现加减乘除四则运算。

先来设计一下类图

简单工厂模式示例.png
由于四则运算都是运算符,都可以继承自同一个父类,所以用运算类来作为他们的父类,再用一个简单工厂类来根据运算类的种类来产生不同的运算符

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//定义抽象运算类
abstract class Operation {
protected double NumberA;
protected double NumberB;
public void setNumberA(double NumberA) {
this.NumberA = NumberA;
}
public void setNumberB(double NumberB) {
this.NumberB = NumberB;
}
abstract double GetResult();
}

//加法类
class Add extends Operation {
double GetResult() {
return NumberA + NumberB;
}
}

//减法类
class Subtract extends Operation {
double GetResult() {
return NumberA - NumberB;
}
}

//乘法类
class Multiply extends Operation {
double GetResult() {
return NumberA * NumberB;
}
}

//除法类
class Divide extends Operation {
double GetResult() {
if (NumberB == 0) {
throw new ArithmeticException("Cannot divide by zero.");
}
return NumberA / NumberB;
}
}
//工厂类
class OperationFactory{
public static Operation getOperation(String operation){
//根据传入的字符串类返回不同的运算符类型
switch (operation){
case "add": return new Add();
case "subtract": return new Subtract();
case "multiply": return new Multiply();
case "divide": return new Divide();
default: return null;
}
}
}

public class SimpleFactory {
public static void main(String[] args) {
Operation operation;
OperationFactory factory = new OperationFactory();
//根据字符串来生产出不同的运算符
operation = factory.getOperation("add");
operation.setNumberA(10);
operation.setNumberB(20);
System.out.println(operation.GetResult());
}
}

简单工厂模式包含如下角色

  1. Factory(工厂角色),他是简单工厂模式的核心,负责实现创建所有实例的内部逻辑
  2. Product(抽象产品角色),抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描绘所有实例所共有的公共接口
  3. ConcreteProduct(具体产品角色),具体产品角色是简单工厂模式的创建目标

模式分析

要修改或扩展运算能力,只需要对相应的子类进行修改或增加新的子类,再把工厂类做适当的修改。
所以不符合开闭原则
实现了一个结构相对合理的程序,具备了面向对象编程的特点,算是实现了高内聚、低耦合,易维护、
易扩展、易复用的目的。
以简单工厂类为接口,工厂类根据不同输入参数创建具体的对象,实现界面和业务的解耦(界面需求改
变和业务需求改变不互相影响)
对业务进行封装,利用继承使程序容易扩展,利用多态,用工厂类来实现对象实例的创建维护。