简单工厂模式动机与定义
在实际的软件开发过程中,有时需要创建一些来自于相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,可以通过传入不同的参数来获得不同的对象,这个就是最简单的设计模式之一简单工厂模式
举个例子
现在要写一个计算器程序,实现加减乘除四则运算。
先来设计一下类图

由于四则运算都是运算符,都可以继承自同一个父类,所以用运算类来作为他们的父类,再用一个简单工厂类来根据运算类的种类来产生不同的运算符
代码实现
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()); } }
|
简单工厂模式包含如下角色
- Factory(工厂角色),他是简单工厂模式的核心,负责实现创建所有实例的内部逻辑
- Product(抽象产品角色),抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描绘所有实例所共有的公共接口
- ConcreteProduct(具体产品角色),具体产品角色是简单工厂模式的创建目标
模式分析
要修改或扩展运算能力,只需要对相应的子类进行修改或增加新的子类,再把工厂类做适当的修改。
所以不符合开闭原则
实现了一个结构相对合理的程序,具备了面向对象编程的特点,算是实现了高内聚、低耦合,易维护、
易扩展、易复用的目的。
以简单工厂类为接口,工厂类根据不同输入参数创建具体的对象,实现界面和业务的解耦(界面需求改
变和业务需求改变不互相影响)
对业务进行封装,利用继承使程序容易扩展,利用多态,用工厂类来实现对象实例的创建维护。