工厂方法模式(factory method)

一、        作用

本模式是用来产生一个或一类产品。这一类产品有一个共同的父类。

二、        模型图

 工厂方法模式(factory method) - 长空飞雪 - 我的菜鸟日记

 

三、        参与者

1、Creater:一个,对外提供操作接口。

2、ConcreteCreater:一个,负责具体产品的生成。

3、AbstractProduct:一个。一类抽象产品。

4、ConcreteProduct:多个,继承自AbstractProduct。

四、        操作流程

本模式有多种实现,最简单的是参数化工厂方法:即给接口传一个ProductID,接口就产生相关产品,这种方法能产生一类产品。

五、        比较

一、与抽象工厂模式

1、抽象工厂模式在使用时,要实例化一个具体的子工厂。工厂方法可以不要,可以直接生产。

2、抽象工厂模式一般要传一个工厂ID,选择实例化哪个工厂;而参数化工厂方法要传一个产品ID,选择要哪个具体产品。

3、抽象工厂模式用的是组合,而工厂方法模式用的是继承。

六、        C++实现

一个衬衣生产厂,可以生产女式和男式衬衣。

以下是C++代码实现:

 

#include <iostream>

using namespace std;

 

 

class AbstractShirt

{

public:

    virtual void Show(void) = 0;

};

 

class WomanShirt: public AbstractShirt

{

public:

    void Show(void)

    {

        cout<<"I am WomanShirt!"<<endl;

    }

};

 

class ManShirt: public AbstractShirt

{

public:

    void Show(void)

    {

        cout<<"I am ManShirt!"<<endl;

    }

};

 

class ShirtFactory

{

public:

    enum{WOMAN_SHIRT, MAN_SHIRT};

 

    AbstractShirt *CreateShirt(int ShirtID);

    void DestroyShirt(AbstractShirt *pShirt);

};

 

AbstractShirt *ShirtFactory::CreateShirt(int ShirtID)

{

    AbstractShirt *pShirt = NULL;

 

    switch (ShirtID)

    {

    case WOMAN_SHIRT:

        pShirt = new WomanShirt;

        break;

    case MAN_SHIRT:

        pShirt = new ManShirt;

        break;

    default:

        break;

    }

    return pShirt;

}

 

void ShirtFactory::DestroyShirt(AbstractShirt *pShirt)

{

    delete pShirt;

}

 

int main(int argc, char **argv)

{

    ShirtFactory shirtFactory;

    AbstractShirt *pShirt;

 

    pShirt = shirtFactory.CreateShirt(ShirtFactory::WOMAN_SHIRT);

    pShirt->Show();

    shirtFactory.DestroyShirt(pShirt);

    pShirt = shirtFactory.CreateShirt(ShirtFactory::MAN_SHIRT);

    pShirt->Show();

    shirtFactory.DestroyShirt(pShirt);

 

    return 0;

}

 

另一例:采用模板的方式:

 

 

#include <iostream>

using namespace std;

 

 

class AbstractShirt

{

public:

    virtual void Show(void) = 0;

};

 

class WomanShirt: public AbstractShirt

{

public:

    void Show(void)

    {

        cout<<"I am WomanShirt!"<<endl;

    }

};

 

class ManShirt: public AbstractShirt

{

public:

    void Show(void)

    {

        cout<<"I am ManShirt!"<<endl;

    }

};

 

template <class ProductT>

class FactoryOf

{

public:

    ProductT *CreateProduct(void)

    {

        return new ProductT;

    }

    void DestroyProduct(ProductT *pProduct)

    {

        delete pProduct;

    }

};

 

 

int main(int argc, char **argv)

{

    FactoryOf<ManShirt> shirtFactory;

    ManShirt *pShirt;

 

    pShirt = shirtFactory.CreateProduct();

    pShirt->Show();

    shirtFactory.DestroyProduct(pShirt);

 

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值