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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐