抽象工厂模式
前一章节,我们介绍了简单工厂模式以及工厂方法模式,但是这两种模式都存在一定的局限性,只能生产某一类型下的某一种产品,如果需求变更,同类型下出现了不同的产品,比如芝士披萨不仅有口味上的不同,同时存在外观上的不同。这种时候,工厂模式显然不再满足要求,该怎么办呢?于是我们想到DIP原则,它不正是为了解决这种情况而存在的吗?接下来我们来介绍下抽象工厂模式:
-
抽象工厂模式定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
-
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
-
从设计层面来说,抽象工厂模式就是对简单工厂模式的改进(即进一步抽象化)
-
将工厂抽象成两层,抽象工厂和具体的实现工厂。
理解:
读过一些博主的博文以及评论,有一些理解还是蛮到位的:
- 抽象工厂比工厂方法复杂的多,它们的目的不同。工厂方法意在延迟加载,而抽象方法意在高内聚低耦合。
- 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂可以创建多个。
// 键盘
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();