C++设计模式02——工厂方法模式

What(是什么:定义)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

Why(为什么要使用:效果是什么
工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理Product接口;因此它可以与用户定义的任何ConcreteProduct类一起使用。
工厂方法的一个潜在缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建Creator的子类。当Creator子类不必需时,客户现在必然要处理类演化的其他方面;但是当客户无论 如何必须创建Creator的子类时,创建子类也是可行的。

Who(变化的是谁:可变的方面
被实例化的子类

When(什么情况下使用:适用性
在下列情况下可以使用FactoryMethod模式
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

Where(结构在哪里:结构UML)

How(如何实现:代码

代码实现:

#include <iostream>

using namespace std;

class Product
{
public:
    virtual void ConcreteProduct() = 0;
    virtual ~Product() { }
};

class CPUProduct: public Product
{
public:
    void ConcreteProduct()
    {
        cout << "I'm CPU ===============Product" << endl;
    }

    ~CPUProduct()
    {
        cout << "destructor ==========CPUProduct" << endl;
    }
};

class ScreenProduct: public Product
{
public:
    void ConcreteProduct()
    {
        cout << "I'm Screen ============Product" << endl;
    }

    ~ScreenProduct()
    {
        cout << "destructor ==========ScreenProduct" << endl;
    }
};

class Factory
{
public:
    virtual Product* CreateProduct() = 0;
    virtual ~Factory() { }
};

class CPUFactory: public Factory
{
public:
    Product * CreateProduct()
    {
        return new CPUProduct();
    }
    ~CPUFactory()
    {
        cout << "destructor ==========CPUFactory" << endl;
    }
};

class ScreenFactory: public Factory
{
public:
    Product * CreateProduct()
    {
        return new ScreenProduct();
    }
    ~ScreenFactory()
    {
        cout << "destructor ==========ScreenFactory" << endl;
    }
};

int main()
{
    unique_ptr<Factory> cpuFactory(new CPUFactory());
    unique_ptr<Product> cpuProduct(cpuFactory->CreateProduct());
    cpuProduct->ConcreteProduct();

    unique_ptr<Factory> screenFactory(new ScreenFactory());
    unique_ptr<Product> screenProduct(screenFactory->CreateProduct());
    screenProduct->ConcreteProduct();

    cout << "Hello World!" << endl;
    return 0;
}


生活中的例子:

设计模式的核心:查找变化,封装变化

update:2021-08-18

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值