抽象工厂模式
抽象工厂模式
应用场景:
例如:
假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示:
1.系列相关产品, 例如 椅子Chair 、 沙发Sofa和 咖啡桌CoffeeTable 。
2.系列产品的不同变体。 例如, 你可以使用 现代Modern 、 维多利亚Victorian 、 装饰风艺术ArtDeco等风格生成 椅子 、 沙发和 咖啡桌 。
你需要设法单独生成每件家具对象, 这样才能确保其风格一致。 如果顾客收到的家具风格不一样, 他们可不会开心。
此外, 你也不希望在添加新产品或新风格时修改已有代码。 家具供应商对于产品目录的更新非常频繁, 你不会想在每次更新时都去修改核心代码的。
解决方案:
首先, 抽象工厂模式建议为系列中的每件产品明确声明接口 (例如椅子、 沙发或咖啡桌)。 然后, 确保所有产品变体都继承这些接口。 例如, 所有风格的椅子都实现 椅子接口; 所有风格的咖啡桌都实现 咖啡桌接口, 以此类推。

接下来, 我们需要声明抽象工厂——包含系列中所有产品构造方法的接口。 例如
那么该如何处理产品变体呢? 对于系列产品的每个变体, 我们都将基于 抽象工厂接口创建不同的工厂类。 每个工厂类都只能返回特定类别的产品, 例如, 现代家具工厂ModernFurnitureFactory只能创建 现代椅子ModernChair 、 现代沙发ModernSofa和 现代咖啡桌ModernCoffeeTable对象。
客户端代码可以通过相应的抽象接口调用工厂和产品类。 你无需修改实际客户端代码, 就能更改传递给客户端的工厂类, 也能更改客户端代码接收的产品变体。
模型结构:
参考代码:
class Chair
{
public:
virtual bool hasLegs() const = 0;
virtual void sitON() {};
};
class CoffeeTable
{
public:
virtual bool hasFourLegs()const = 0;
virtual void forCoffee(){}
};
class FurnitureFactory
{
public:
virtual Chair* createChair() = 0 ;
virtual CoffeeTable* createCoffeeTable() =0;
};
class VictorianChair :public Chair
{
public:
bool hasLegs() const override{
std::cout << "victorianChair chair\n";
return true;
};
void sitON() override
{
std::cout << "sit on victorianChair chair\n";
}
};
class ModernChair :public Chair
{
public:
bool hasLegs() const override {
std::cout << "ModernChair chair\n";
return true;
};
void sitON() override
{
std::cout << "sit on ModernChair chair\n";
}
};
class VictorianCoffeeTable :public CoffeeTable
{
public:
virtual bool hasFourLegs()const override
{
std::cout << "VictorianCoffeeTable \n";
return true;
}
virtual void forCoffee() override{
std::cout << "VictorianCoffeeTable for coffee\n";
}
};
class ModernCoffeeTable :public CoffeeTable
{
public:
virtual bool hasFourLegs()const override
{
std::cout << "ModernCoffeeTable \n";
return true;
}
virtual void forCoffee() override {
std::cout << "ModernCoffeeTable for coffee\n";
}
};
class VictoranFurnitureFactory :public FurnitureFactory
{
public:
Chair* createChair()
{
return new VictorianChair();
}
CoffeeTable* createCoffeeTable()
{
return new VictorianCoffeeTable();
}
};
class ModernFurnitureFactory :public FurnitureFactory
{
public:
Chair* createChair()
{
return new ModernChair();
}
CoffeeTable* createCoffeeTable()
{
return new ModernCoffeeTable();
}
};
void ClientCode( FurnitureFactory *factory) {
Chair *chair = factory->createChair();
CoffeeTable *table = factory->createCoffeeTable();
chair->sitON();
table->forCoffee();
delete chair;
delete table;
}
posted on 2021-05-14 16:30 Ultraman_X 阅读(96) 评论(0) 收藏 举报
浙公网安备 33010602011771号