Factory模式
//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
class Product {
public:
virtual ~Product() = 0;
protected:
Product();
};
class ConcreteProduct:public Product {
public:
~ConcreteProduct();
ConcreteProduct();
};
#endif |
//Product.cpp
#include"Product.h"
#include<iostream>
usingnamespace std;
Product::Product() {
}
Product::~Product() {
}
ConcreteProduct::ConcreteProduct() {
cout<<"ConcreteProduct...."<<endl;
}
ConcreteProduct::~ConcreteProduct() {
} |
//Factory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_
class Product;
class Factory {
public:
virtual~Factory() =0;
virtual Product* CreateProduct()= 0;
protected:
Factory();
};
class ConcreteFactory:public Factory { public: ~ConcreteFactory();
ConcreteFactory();
Product* CreateProduct();
}; #endif |
//Factory.cpp
#include"Factory.h" #include"Product.h"
#include<iostream> usingnamespace std;
Factory::Factory() {
}
Factory::~Factory() {
}
ConcreteFactory::ConcreteFactory() { cout<<"ConcreteFactory....."<<endl; }
ConcreteFactory::~ConcreteFactory() {
}
Product* ConcreteFactory::CreateProduct() { returnnew ConcreteProduct(); } |
//main.cpp
#include"Factory.h" #include"Product.h"
#include<iostream> usingnamespace std;
int main(int argc,char* argv[]) { Factory* fac=new ConcreteFactory(); Product* p=fac->CreateProduct();
return0; } |
代码说明
示例代码中给出的是 Factory模式解决父类中并不知道具体要实例化哪一个具体的子类
的问题,至于为创建对象提供接口问题,可以由 Factory中附加相应的创建操作例如
Create***Product()即可
Factory模式也带来至少以下两个问题:
1)如果为每一个具体的 ConcreteProduct类的实例化提供一个函数体,那么我们可能不得不在系统中添加了一个方法来处理这个新建的 ConcreteProduct,这样 Factory 的接口永远就不肯能封闭(Close)。当然我们可以通过创建一个 Factory的子类来通过多态实现这一点,但是这也是以新建一个类作为代价的。 2)在实现中我们可以通过参数化工厂方法,即给 FactoryMethod()传递一个参数用以决定是创建具体哪一个具体的 Product(实际上笔者在VisualCMCS中也正是这样做的)。当然也可以通过模板化避免 1)中的子类创建子类,其方法就是将具体 Product类作为模板参数,实现起来也很简单。