C++ 设计模式之简单工厂模式

本文介绍了工厂方法模式,首先概述了简单工厂模式,然后详细讲解了工厂类、抽象产品和具体产品之间的关系。通过C++代码示例展示了如何使用抽象工厂模式管理不同类型的积木创建。文章还提及了工厂方法模式在Spring和JDBC中的实际应用。
摘要由CSDN通过智能技术生成

       【声明】本课题来源参考卡码网【题目页面 (kamacoder.com)


        在了解⼯⼚⽅法模式之前,有必要对“简单⼯⼚”模式进⾏⼀定的了解,简单⼯⼚模式是⼀种创建型设计模式,但并不属于23种设计模式之⼀,更多的是⼀种编程习惯。

        简单⼯⼚模式的核⼼思想是将产品的创建过程封装在⼀个⼯⼚类中,把创建对象的流程集中在这个⼯⼚类⾥⾯。

        简单⼯⼚模式包括三个主要⻆⾊,⼯⼚类、抽象产品、具体产品,下⾯的图示则展示了⼯⼚类的基本结构。

  • 抽象产品,⽐如上图中的Shape 接⼝,描述产品的通⽤⾏为。
  • 具体产品: 实现抽象产品接⼝或继承抽象产品类,⽐如上⾯的Circle 类和Square 类,具体产品通过简单⼯⼚类的if-else 逻辑来实例化。
  • ⼯⼚类:负责创建产品,根据传递的不同参数创建不同的产品示例。

        简单⼯⼚类简化了客户端操作,客户端可以调⽤⼯⼚⽅法来获取具体产品,⽽⽆需直接与具体产品类交互,降低了耦合,但是有⼀个很⼤的问题就是不够灵活,如果需要添加新的产品,就需要修改⼯⼚类的代码。


应⽤场景
⼯⼚⽅法模式使得每个⼯⼚类的职责单⼀,每个⼯⼚只负责创建⼀种产品,当创建对象涉及⼀系列复杂的初始化逻辑,⽽这些逻辑在不同的⼦类中可能有所不同时,可以使⽤⼯⼚⽅法模式将这些初始化逻辑封装在⼦类的⼯⼚中。在现有的⼯具、库中,⼯⼚⽅法模式也有⼴泛的应⽤,⽐如:

  • Spring 框架中的 Bean ⼯⼚:通过配置⽂件或注解,Spring 可以根据配置信息动态地创建和管理对象。
  • JDBC 中的 Connection ⼯⼚:在 Java 数据库连接中, DriverManager 使⽤⼯⼚⽅法模式来创建数据库连接。不同的数据库驱动(如 MySQL、PostgreSQL 等)都有对应的⼯⼚来创建连接。

下面为用C++编码的一段代码:

#include <iostream>
#include <vector>

using namespace std;

// 积木抽象类
class Block
{
public:
    Block(){}
    ~Block(){}
    
public:    
    // 使用 override 必须在基类中声明虚函数
    virtual void Produce(){ }
};

// 圆形积木类
class CircleBlock : public Block
{
public:
    CircleBlock(){}
    ~CircleBlock(){}
    
public:
    void Produce() override;
};

// 生产圆形积木
void CircleBlock::Produce()
{
    std::cout << "Circle Block" << endl;
}

// 方形积木类
class SquareBlock : public Block
{
public:
    SquareBlock(){}
    ~SquareBlock(){}
    
public:    
    void Produce() override;
};

// 生产方形积木
void SquareBlock::Produce()
{
    std::cout << "Square Block" << endl;
}


// 抽象工厂类 -- 去实例化各个不同的产品
class Factory{

public:   
   Factory(){}
   ~Factory(){}

public:  
    // 使用 override 必须在基类中声明虚函数
    virtual Block* CreateBlock(){return nullptr;}
};


// 声明 圆形积木类
class CircleBlock;
// 圆形积木工厂
class CircleFactory : public Factory
{
public:   
   CircleFactory(){}
   ~CircleFactory(){}

public:    
    Block* CreateBlock() override;
};

// 实例化圆形积木
Block* CircleFactory::CreateBlock()
{
    return (new CircleBlock());
}

// 声明 方形积木类
class SquareBlock;
// 方形积木工厂
class SquareFactory : public Factory
{
public:   
   SquareFactory(){}
   ~SquareFactory(){}

public:    
    Block* CreateBlock() override;
};

// 实例化方形积木
Block* SquareFactory::CreateBlock()
{
    return (new SquareBlock());
}

// 将各个积木生产规则统一管理
class BlockFactoryManager
{
// 成员数据  保存同一个积木类型的所有积木
private:
    std::vector<Block *> _blocks;
public:
    BlockFactoryManager(){}
    ~BlockFactoryManager(){}
    
public:
    void ProduceAllBlocks(Factory* factory, int number);

};

// 生产同一类型的所有积木 -- 将其打印出来 调用每个 积木类的 Produce
void BlockFactoryManager::ProduceAllBlocks(Factory *factory, int number)
{
    for (int i = 0; i < number; i++)
    {
        // 将创建的派生类转换为基类 向上类型转换 是安全的
        Block* block = factory->CreateBlock();
        _blocks.push_back(block);
        block->Produce();
    }
}

int main()
{
    // 实例化积木工厂管理类
    BlockFactoryManager *blockFactoryManager = new BlockFactoryManager();
    
    // 生产数量
    int produceNum = 0;
    // 积木名称
    string blockName = "";
    // 积木数量
    int blockNum = 0;
    
    std::cin >>  produceNum;
    for(int i = 0; i < produceNum; i++)
    {
        std::cin >> blockName >> blockNum;
        
        if(blockName == "Circle")
            blockFactoryManager->ProduceAllBlocks(new CircleFactory(), blockNum);
        else if(blockName == "Square")
            blockFactoryManager->ProduceAllBlocks(new SquareFactory(), blockNum);
    }
    
    delete  blockFactoryManager;
    blockFactoryManager = nullptr;
    return 0;
}

......

To be continued.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写代码的小恐龙er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值