一,简单工厂模式
1.1,对简单工厂模式的理解
简单工厂模式: 定义一个创建对象的接口,让子类决定实例化哪一个类。
1.2,解决的问题
主要去解决如何去实例化对象的问题,即判断要创建哪一个类对象(例如:加法类、减法类),以及对应的类会不会增加(例如:以后可能增加乘法类、除法类)
1.3,应用场景
使用面向对象的原则写一个计算器程序,下面是程序的结构框图与源代码
// 运算符类基类
class Operation
{
public:
Operation(double a, double b):numberA(a), numberB(b){}
double getResult();
protected:
double numberA;
double numberB;
};
// 加法运算
class AddOperation : public Operation
{
public:
double getResult()
{
return numberA + numberB;
}
};
// 减法运算
class SubOperation : public Operation
{
public:
double getResult()
{
return numberA - numberB;
}
};
// 简单运算符工厂类
class OperationFactory
{
public:
static Operation *createOperation(String operation)
{
Operation *oper = NULL;
switch(operation)
{
case "+":
oper = new AddOperation();
break;
case "-":
oper = new SupOperation();
break;
}
return oper;
}
};
// 客户端代码
void main()
{
Operation *oper = OperationFactory.createOperation("+");
oper->numberA = 1;
oper->numberB = 2;
double result = oper.getResult();
}
程序分析:
运算符类是会发生变化的,根据需求可能会添加新的运算符操作,例如:开根号、取模运算。这些都是属于会变化的部分,面向对象的精髓在于封装,封装就是要封装可能会变化的部分,然后对外提供一个稳定的接口。使用工厂类创建具体的运算符对象,对外提供一个稳定的接口createOperation,客户端代码与这个接口耦合在一起。即使以后添加新的运算符操作,只用在工厂类中进行修改,客户端代码丝毫不受影响。
1.4,简单工厂模式的优点与缺点
优点:
- 简单工厂模式实现创建类对象的代码与客户端代码的分离,客户端通过工厂获取要创建的对象,不用关心对象是如何创建的。如果要创建的类对象发生了变化,只需要在工厂类中进行修改。
缺点:
- 由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中。它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。