抽象工厂模式

抽象工厂模式

应用场景:

例如:
假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示:

1.系列相关产品, 例如 椅子Chair 、 ​ 沙发Sofa和 咖啡桌Coffee­Table 。

2.系列产品的不同变体。 例如, 你可以使用 现代Modern 、 ​ 维多利亚Victorian 、 ​ 装饰风艺术Art­Deco等风格生成 椅子 、 ​ 沙发和 咖啡桌 。

alt text

你需要设法单独生成每件家具对象, 这样才能确保其风格一致。 如果顾客收到的家具风格不一样, 他们可不会开心。
此外, 你也不希望在添加新产品或新风格时修改已有代码。 家具供应商对于产品目录的更新非常频繁, 你不会想在每次更新时都去修改核心代码的。

解决方案:

首先, 抽象工厂模式建议为系列中的每件产品明确声明接口 (例如椅子、 沙发或咖啡桌)。 然后, 确保所有产品变体都继承这些接口。 例如, 所有风格的椅子都实现 椅子接口; 所有风格的咖啡桌都实现 咖啡桌接口, 以此类推。
alt text
接下来, 我们需要声明抽象工厂——包含系列中所有产品构造方法的接口。 例如 create­Chair创建椅子 、 ​ create­Sofa创建沙发和 create­Coffee­Table创建咖啡桌 。 这些方法必须返回抽象产品类型, 即我们之前抽取的那些接口: ​ 椅子 , ​ 沙发和 咖啡桌等等。

alt text 那么该如何处理产品变体呢? 对于系列产品的每个变体, 我们都将基于 抽象工厂接口创建不同的工厂类。 每个工厂类都只能返回特定类别的产品, 例如, ​ 现代家具工厂Modern­Furniture­Factory只能创建 现代椅子Modern­Chair 、 ​ 现代沙发Modern­Sofa和 现代咖啡桌Modern­Coffee­Table对象。

客户端代码可以通过相应的抽象接口调用工厂和产品类。 你无需修改实际客户端代码, 就能更改传递给客户端的工厂类, 也能更改客户端代码接收的产品变体。

模型结构:

alt text

参考代码:

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)    收藏  举报

导航