简介

工厂方法模式可以看作是抽象工厂模式的一个特例,当抽象工厂模式创建的产品个数为1时,就成了工厂方法模式。工厂方法模式定义了创建一个对象的接口,由子类来决定实例化的类型。

UML类图

clipboard.png

示例

曾经,日本制造代表着制造的先进水平(现在很多领域依然如此)。虎牌,象印等品牌生产的电饭煲深受消费者的喜爱,并且消费者很关注这些产品的产地。现在,你作为他们的代理商(类似于天猫京东),销售他们的产品,满足消费者的需求。
产品类,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;
}

one_piece
26 声望8 粉丝

« 上一篇
建造者模式
下一篇 »
原型模式