C++ 设计模式-工厂方法

设计模式介绍

一、工厂方法

1. 工厂方法定义

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

2. 工厂方法本质

延迟到子类来选择实现

3. 工厂方法结构和说明

(1) 结构

经典类图:
在这里插入图片描述
具体一个示例:
在这里插入图片描述

(2) 调用顺序

在这里插入图片描述
在这里插入图片描述

4. 工厂方法适用情况

  • 如果一个类需要创建某个接口的对象,但是又不知道具体的实现,这种情况可以选用工厂方法模式,把创建对象的工作延退到子类中去实现。
  • 如果一个类本身就希望由它的子类来创建所需的对象的时候,应该使用工厂方法模式。

5. 工厂方法优缺点

(1) 优点
  • 可以在不知具体实现的情况下编程
    工厂方法模式可以让你在实现功能的时候,如果需要某个产品对象,只需要使用产品的接口即可,而无需关心具体的实现。选择具体实现的任务延退到子类去完成。
  • 更容易扩展对象的新版本
    已有的代码都不会改变,只要新加入一个子类来提供新的工厂方法实现,然后在客户端使用这个新的子类即可。
  • 连接平行的类层次
    工厂方法除了创造产品对象外,在连接平行的类层次上也大显身手。比如有一个硬盘的接口, 具体实现有台式机希捷, 笔记本IBM。所以还会各自有着自己的读写硬盘方法。这种情况下使用工厂方法是比较合适的
    在这里插入图片描述
(2) 缺点
  • 具体产品对象和工厂方法的耦合性。
    在工厂方法模式中,工厂方法是需要创建产品对象的,也就是需要选择具体的产品对象,并创建它们的实例,因此具体产品对象和工厂方法是耦合的。

6. 相关模式

  • 工厂方法模式和抽象工厂模式
    这两个模式可以组合使用,具体的放到抽象工厂模式中去讲。
  • 工厂方法模式和模板方法模式
    这两个模式外观类似,都有一个抽象类,然后由子类来提供一些实现,但是工厂方法模式的子类专注的是创建产品对象,而模板方法模式的子类专注的是为固定的算法骨架提供某些步骤的实现。
    这两个模式可以组合使用,通常在模板方法模式里面,使用工厂方法来创建模板方法需要的对象。

二、工厂方法示例代码

#include <iostream>
using namespace std;

//客户端使用Creator对象

//抽象产品
class Product {
public:
    virtual ~Product(){}
    virtual void Operation() = 0;
};

//具体产品A
class ConcreteProductA : public Product {
public:
    void Operation() override { cout << "ConcreteProductA" << endl; }
};

//具体产品B
class ConcreteProductB : public Product {
public:
    void Operation() override { cout << "ConcreteProductB" << endl; }
};

//抽象工厂
class Creator{
public:
    //一些操作
    void Operator()
    {
        Product* p = this->FactoryMethod();
        if(p != nullptr)
        {
            p->Operation();
            delete p;
        }
    }

    virtual ~Creator(){}

protected:
    //工厂方法
    virtual Product* FactoryMethod() = 0;
};

class ConcreteCreatorA : public Creator {
protected:
    Product* FactoryMethod() override { return new ConcreteProductA(); }
};

class ConcreteCreatorB : public Creator {
protected:
    Product* FactoryMethod() override { return new ConcreteProductB(); }
};

int main() {
    Creator* cA = new ConcreteCreatorA();
    if(cA != nullptr)
    {
        cA->Operator();
        delete cA;
    }

    Creator* cB = new ConcreteCreatorB();
    if(cB != nullptr)
    {
        cB->Operator(); // ConcreteProductB
        delete cB;
    }
    return 0;
}
#include <iostream>
using namespace std;

//客户端使用Creator创建出来的对象

//抽象产品
class Product {
public:
    virtual ~Product(){}
    virtual void Operation() = 0;
};

//具体产品A
class ConcreteProductA : public Product {
public:
    void Operation() override { cout << "ConcreteProductA" << endl; }
};

//具体产品B
class ConcreteProductB : public Product {
public:
    void Operation() override { cout << "ConcreteProductB" << endl; }
};

//抽象工厂
class Creator{
public:
    virtual Product* FactoryMethod() = 0;
    virtual ~Creator(){}
};

class ConcreteCreatorA : public Creator {
protected:
    Product* FactoryMethod() override { return new ConcreteProductA(); }
};

class ConcreteCreatorB : public Creator {
protected:
    Product* FactoryMethod() override { return new ConcreteProductB(); }
};

int main() {
    //示例程序不判空了
    Creator* cA = new ConcreteCreatorA();
    Product* pA = cA->FactoryMethod();
    pA->Operation();
    delete cA;
    delete pA;

    Creator* cB = new ConcreteCreatorB();
    Product* pB = cB->FactoryMethod();
    pB->Operation();
    delete cB;
    delete pB;
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值