简介
工厂方法模式可以看作是抽象工厂模式的一个特例,当抽象工厂模式创建的产品个数为1时,就成了工厂方法模式。工厂方法模式定义了创建一个对象的接口,由子类来决定实例化的类型。
UML类图
示例
曾经,日本制造代表着制造的先进水平(现在很多领域依然如此)。虎牌,象印等品牌生产的电饭煲深受消费者的喜爱,并且消费者很关注这些产品的产地。现在,你作为他们的代理商(类似于天猫京东),销售他们的产品,满足消费者的需求。
产品类,product.h
#ifndef PRODUCT_H
#define PRODUCT_H
#include <iostream>
using namespace std;
class CCooker //电饭煲
{
public:
virtual void Cook() = 0;
};
class CTigerCooker:public CCooker
{
public:
virtual void Cook(){cout<<"TigerCooker Cook."<<endl;};
};
class CZojirushiCooker:public CCooker
{
public:
virtual void Cook(){cout<<"ZojirushiCooker Cook."<<endl;};
};
#endif
工厂类,factory.h
#ifndef FACTORY_H
#define FACTORY_H
#include <string>
#include "product.h"
using namespace std;
class CFactory
{
public:
CFactory(string strAddr):m_strAddr(strAddr){};
virtual CCooker* CreateCooker() = 0;
public:
string m_strAddr;
};
class CTigerFactory:public CFactory
{
public:
CTigerFactory(string strAddr):CFactory(strAddr){};
CCooker* CreateCooker(){return new CTigerCooker;};
};
class CZojirushiFactory:public CFactory
{
public:
CZojirushiFactory(string strAddr):CFactory(strAddr){};
CCooker* CreateCooker(){return new CZojirushiCooker;};
};
#endif
客户端调用,main.cpp
#include "factory.h"
#define SAFE_DELETE(p) if(p){delete (p); (p) = NULL;}
int main(int argc, char* argv[])
{
//1.一个顾客想要构建中国产虎牌电饭煲
CFactory* pTigerFactory = new CTigerFactory("China");
CCooker* pTigerCooker = pTigerFactory->CreateCooker();
SAFE_DELETE(pTigerCooker);
SAFE_DELETE(pTigerFactory);
//2.另一个顾客想要日本产象印牌电饭煲
CFactory* pZojirushiFactory = new CZojirushiFactory("Japan");
CCooker* pZojirushiCooker = pZojirushiFactory->CreateCooker();
SAFE_DELETE(pZojirushiCooker);
SAFE_DELETE(pZojirushiFactory);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。