1、简单工厂模式的设计思想
首先将需要创建的各种不同对象的相关代码封装到不同的类中,这些类称为产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象;客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。
2、简单工厂模式的3个角色
(1)Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。
(2)Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
(3)ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。
3、代码实现
#include<iostream>
using namespace std;
class AbstractProduct
{
public:
AbstractProduct(string name) :mname(name)
{}
virtual void operation() = 0;
virtual ~AbstractProduct()
{}
protected:
string mname;
};
class ProductA : public AbstractProduct
{
public:
ProductA(string name) :AbstractProduct(name)
{}
~ProductA()
{}
virtual void operation()
{
cout << "ProductA::Operation()" << endl;
}
};
class ProductB : public AbstractProduct
{
public:
ProductB(string name) :AbstractProduct(name)
{}
~ProductB()
{}
virtual void operation()
{
cout << "ProductB::Operation()" << endl;
}
};
class Factory
{
public:
AbstractProduct* createProduct(int flag)
{
switch (flag)
{
case 1:
return new ProductA("A");
break;
case 2:
return new ProductB("B");
break;
default:
return NULL;
break;
}
}
};
int main()
{
Factory f;
AbstractProduct* pap = f.createProduct(1);
pap->operation();
AbstractProduct* pbp = f.createProduct(2);
pbp->operation();
delete pap;
delete pbp;
return 0;
}
运行结果: