【声明】本课题来源参考卡码网【题目页面 (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.