专门用一个单独的类负责创建其他类的实例,被创建的实例通常都具有共同的父类,以根据参数的不同返回不同类的实例。
简单工厂模式中包含的角色及其相应的职责如下:
工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
例子:
Operation运算类
class Operation
{
public:
double numberA,numberB;
virtual double getResult()
{
return 0;
}
};
加减乘除类
class addOperation:public Operation
{
double getResult()
{
return numberA+numberB;
}
};
class subOperation:public Operation
{
double getResult()
{
return numberA-numberB;
}
};
class mulOperation:public Operation
{
double getResult()
{
return numberA*numberB;
}
};
class divOperation:public Operation
{
double getResult()
{
return numberA/numberB;
}
};
简单运算工厂类
class operFactory
{
public:
static Operation *createOperation(char c)
{
switch(c)
{
case '+':
return new addOperation;
break;
case '-':
return new subOperation;
break;
case '*':
return new mulOperation;
break;
case '/':
return new divOperation;
break;
}
}
};
客户端代码
int main()
{
Operation *oper=operFactory::createOperation('+');
oper->numberA=9;
oper->numberB=99;
cout<<oper->getResult()<<endl;
return 0;
}
优缺点:
工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。违背了OCP(开放-封闭原则,即对扩展开放,对修改封闭。开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以提升软件的可维护、可扩展、可复用、灵活性好。) 在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。