<aside> 💡
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类
</aside>
https://kamacoder.com/problempage.php?pid=1076
#include <iostream>
#include <string>
using namespace std;
// 抽象产品类
class Product{
public:
virtual void productBlock(){};
};
// 具体产品类
class CircleProduct: public Product{
public:
CircleProduct(int n): m_n(n){};
void productBlock() override {
for(int i = 0; i < m_n; ++i){
cout << "Circle Block" << endl;
}
}
private:
int m_n;
};
class SquareProduct: public Product{
public:
SquareProduct(int n): m_n(n){};
void productBlock() override {
for(int i = 0; i < m_n; ++i){
cout << "Square Block" << endl;
}
}
private:
int m_n;
};
// 抽象工厂类(一个接口)
class IFactory{
public:
// 接口中只有一个创建抽象产品的工厂方法
virtual Product* createBlock(int n) = 0;
};
// 具体工厂类
class CircleFactory: public IFactory{
public:
CircleProduct* createBlock(int n) override {
return new CircleProduct(n);
}
};
class SquareFactory: public IFactory{
public:
SquareProduct* createBlock(int n) override {
return new SquareProduct(n);
}
};
int main(){
int n;
cin >> n;
for(int i = 0; i < n; ++i){
string blockType;
int blockNum;
cin >> blockType >> blockNum;
IFactory* factory = nullptr;
Product* product = nullptr;
// 根据客户端的选项创建对应的工厂对象
if(blockType == "Circle"){
factory = new CircleFactory();
}else if(blockType == "Square"){
factory = new SquareFactory();
}else{
cout << "请输入正确的积木类型" << endl;
--i;
continue;
}
// 使用工厂对象创建产品
product = factory->createBlock(blockNum);
// 使用产品
product->productBlock();
delete factory;
delete product;
}
return 0;
}