一、模式图
二、示例代码
代码片断1:Product.h
//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
class Product
{
public:
virtual ~Product() =0;
protected:
Product();
private:
}
class ConcreteProduct:publicProduct
{
public:
~ConcreteProduct();
ConcreteProduct(); protected:
private:
};
#endif
代码片断2:Product.cpp
//Product.cpp
#include "Product.h"
#include<iostream>
using namespace std;
Product::Product()
{
}
Product::~Product()
{
}
ConcreteProduct::ConcreteProduct()
{
cout<<"ConcreteProduct...."<<endl;
}
ConcreteProduct::~ConcreteProduct()
{
}
代码片断3:Factory.h
//Factory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_
class Product;
class Factory
{
public:
virtual ~Factory() = 0;
virtual Product* CreateProduct() = 0;
protected: Factory();
private:
};
class ConcreteFactory:public Factory
{
public:
~ConcreteFactory();
ConcreteFactory();
Product* CreateProduct();
protected:
private:
};
#endif //~_FACTORY_H_
代码片断4:Factory.cpp
//Factory.cpp
#include "Factory.h"
#include "Product.h"
#include <iostream>
using namespace std;
Factory::Factory() {
}
Factory::~Factory() {
}
ConcreteFactory::ConcreteFactory()
{
cout<<"ConcreteFactory....."<<endl;
}
ConcreteFactory::~ConcreteFactory()
{
}
Product* ConcreteFactory::CreateProduct()
{
return new ConcreteProduct();
}
代码片断5:main.cpp
//main.cpp
#include "Factory.h"
#include "Product.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
Factory* fac = new ConcreteFactory();
Product* p = fac->CreateProduct();
return 0;
}
学习总结
(一)在代码片段三中有段代码如下class Product;加入这段代码的原因是这段代码中引用了类Product但又没有把头文件引入进来,因此在这里需要加上这行代码,至于不适用头文件的方式是因为这样可以达到优化的目的,当然也可以把头文件引用的方式替换这种方式
(二)为什么要引入ConcreteFactory这个类,这个是一个工厂类,不加也可以其实可以这样写 Product *p =new xxx()(XXX是某个子类),之所以要加上这个类是因为万一子类太多,无法记住所有类的名字,这个时候就可以引入上面的这个工厂类,直接在工厂类中写入所有子类的名字,这样通过工厂类的函数就可以得到子类的名字,如此只要查找工厂就知道有那些产品而无需去查阅所有的产品类。
(三)若以后有新的产品引入就可以直接给产品类添加一个子类,然后在工厂类的子类中添加一个函数即可