工厂模式
-
工厂模式:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推到具体的子工厂类当中。实现创建型模式中的“创建与使用相分离”。
-
按实际业务场景,工厂模式有3中不同的实现方式:简单工厂模式、工厂方法模式和抽象工厂模式。
-
将被创建的对象称为产品,创建商品的对象称为工厂。
简单工厂模式
当创建的产品不多时,一个工厂类就可以完成。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。使用这个模式可以把对象的创建和对象的使用分离分开,工厂只负责对象的创建,客户端程序调用和使用对象,客户端程序无需创建对象。对象的创建放在一起,方便维护和扩展。
程序:可复用、可维护、可拓展、灵活性好
简单工厂模式的优点:
1)将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易;
2)在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可;对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量;
3)通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
简单工厂模式的缺点:
1)由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
2) 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
3)系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
适用环境:
适用于工厂类创建的对象少且客户端对传入工程类参数不关心的情况下。
题目示例:
实现一个简单的计算器应用程序。
功能要求:
1) 只需要实现+、-、*、、/四种运算;
2) 程序运行时,输入两个数和运算符号,即可得到运算结果。
例子目录结构如图所示:
Operation
public class Operation {
private double _numberA=0.0;
private double _numberB=0.0;
public void set_numberA(double _numberA) {
this._numberA = _numberA;
}
public void set_numberB(double _numberB) {
this._numberB = _numberB;
}
public double get_numberA() {
return _numberA;
}
public double get_numberB() {
return _numberB;
}
public double GetResult(){
double result=0.0;
return result;
}
}
OperationAdd,另外OperationSub等三种运算代码与其相似。
public class OperationAdd extends Operation{
public double GetResult() {
double result=0.0;
result=this.get_numberA()+this.get_numberB();
return result;
}
}
OperationFactory简单工厂创建静态实例,包含必要的逻辑判断,决定什么时候创建出哪一个产品的实例。
public class OperationFactory {
public static Operation createOperation(String operate) {
Operation oper = null;
switch (operate) {
case "+":
oper =</