C++---工厂方法模式
模式简介
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现'开-闭 原则',实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
模式实现
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。
角色构建
抽象工厂角色:是工厂方法模式的核心,任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂角色:是实现抽象工厂接口的具体工厂类。
抽象产品角色:是工厂方法模式所创建的产品的父类;
具体产品角色:实现抽象产品的某个具体产品的对象
代码示例:
class Product//产品抽象类
{
public:
Product(std::string name) :mname(name){}
virtual void operation() = 0;
virtual ~Product(){}
protected:
std::string mname;
};
class ProductA : public Product//A产品继承产品类
{
public:
ProductA(std::string name) :Product(name){}
void operation()
{
std::cout << "ProductA" << std::endl;
}
};
class ProductB : public Product//B产品继承产品类
{
public:
ProductB(std::string name) :Product(name){}
void operation()
{
std::cout << "ProductB" << std::endl;
}
};
class ProductC : public Product//C产品继承产品类
{
public:
ProductC(std::string name) :Product(name){}
void operation()
{
std::cout << "ProductC" << std::endl;
}
};
class Factory//产品抽象类
{
public:
virtual Product* createProduct() = 0;
virtual ~Factory(){}
};
class FactoryA :public Factory//A工厂继承工厂类
{
public:
Product* createProduct()
{
return new ProductA("PA");
}
};
class FactoryB :public Factory//B工厂继承工厂类
{
public:
Product* createProduct()
{
return new ProductB("PB");
}
};
class FactoryC :public Factory//C工厂继承工厂类
{
public:
Product* createProduct()
{
return new ProductC("PC");
}
};
int main()
{
Factory* pf = new FactoryC();//基类的指针指向一个派生类对象,生成一个C工厂对象
Product* pp = pf->createProduct();//调用createProduct()函数生成具体产品
pp->operation();
delete pp;
delete pf;
return 0;
}