抽象工厂模式

前一章节,我们介绍了简单工厂模式以及工厂方法模式,但是这两种模式都存在一定的局限性,只能生产某一类型下的某一种产品,如果需求变更,同类型下出现了不同的产品,比如芝士披萨不仅有口味上的不同,同时存在外观上的不同。这种时候,工厂模式显然不再满足要求,该怎么办呢?于是我们想到DIP原则,它不正是为了解决这种情况而存在的吗?接下来我们来介绍下抽象工厂模式:

  1. 抽象工厂模式定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。

  2. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

  3. 从设计层面来说,抽象工厂模式就是对简单工厂模式的改进(即进一步抽象化)

  4. 将工厂抽象成两层,抽象工厂和具体的实现工厂。

理解:

读过一些博主的博文以及评论,有一些理解还是蛮到位的:

  1. 抽象工厂比工厂方法复杂的多,它们的目的不同。工厂方法意在延迟加载,而抽象方法意在高内聚低耦合。
  2. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂可以创建多个。
// 键盘
class KeyBoard
{
public:
	virtual void show() = 0;
};
// 微软的键盘
class KeyBoardMicro : public KeyBoard
{
public:
	void show()
	{
		std::cout << "微软的键盘" << std::endl;
	}
};
// 联想的键盘
class KeyBoardLenovo : public KeyBoard
{
public:
	void show()
	{
		std::cout << "联想的键盘" << std::endl;
	}
};

class Mouse
{
public:
	virtual void show() = 0;
};

// 微软的鼠标
class MouseMicro : public Mouse
{
public:
	void show()
	{
		std::cout << "微软的鼠标" << std::endl;
	}
};
// 联想的鼠标
class MouseLenovo : public Mouse
{
public:
	void show()
	{
		std::cout << "联想的鼠标" << std::endl;
	}
};

//-----------------------------------------
class Factory
{
public:
	virtual KeyBoard * createKeyBoard() = 0;
    virtual Mouse * createMouse() = 0;
};
// 微软的工厂
class FactoryMicro : public Factory
{
public:
	KeyBoard * createKeyBoard()
	{
		return new KeyBoardMicro();
	}
    Mouse * createMouse()
    {
        return new MouseMicro();
    }
};
// 联想的工厂
class FactoryLenovo : public Factory
{
public:
	KeyBoard * createKeyBoard()
	{
		return new KeyBoardLenovo();
	}
    Mouse * createMouse()
    {
        return MouseLenovo();
    }
};
//-----------------------------------------
//use
	// 抽象工厂模式
	Factory * p = new FactoryMicro();
	KeyBoard * pKeyBoard = p->createKeyBoard();
	pKeyBoard->show();
	auto pMouse = p->createMouse();
	pMouse->show();