抽象工厂
- 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是我们本文将要学习的抽象工厂模式的基本思想。
比如有一系列产品:鼠标、键盘、耳机。每个厂商都能生产:惠普,联想,戴尔。惠普生产出来的鼠标是惠普鼠标,戴尔生产的键盘是戴尔键盘。
- UML类图:
如果添加工厂:
如果添加产品:
鼠标抽象类:
class AbstractMouse
{
public:
virtual void ShowName()=0;
};
鼠标的实现:戴尔
class DellMouse:public AbstractMouse
{
public:
virtual void ShowName()
{
cout << "我是戴尔鼠标"<< endl;
}
};
鼠标的实现:惠普
class HpMouse:public AbstractMouse
{
public:
virtual void ShowName()
{
cout << "我是惠普鼠标"<< endl;
}
};
键盘抽象类:
class AbstractKeyboard
{
public:
virtual void ShowName()=0;
};
键盘的实现:戴尔
class DellKeyboard:public AbstractKeyboard
{
public:
virtual void ShowName()
{
cout << "我是戴尔键盘"<< endl;
}
};
键盘的实现:惠普
class HpKeyboard:public AbstractKeyboard
{
public:
virtual void ShowName()
{
cout << "我是惠普键盘"<< endl;
}
};
工厂抽象
class AbstractFactory
{
public:
virtual AbstractMouse* CreactMouse()=0;
virtual AbstractKeyboard* CreactKeyboard()=0;
};
戴尔工厂
class DellFactory:public AbstractFactory
{
public:
virtual AbstractMouse* CreactMouse()
{
return new DellMouse;
}
virtual AbstractKeyboard* CreactKeyboard()
{
return new DellKeyboard;
}
};
惠普工厂
class HpFactory:public AbstractFactory
{
public:
virtual AbstractMouse* CreactMouse()
{
return new HpMouse;
}
virtual AbstractKeyboard* CreactKeyboard()
{
return new HpKeyboard;
}
};
客户端调用
int main(void)
{
AbstractFactory *factory=NULL; //工厂父指针
AbstractMouse* mouse=NULL; //鼠标父指针
AbstractKeyboard* keyboard=NULL; //键盘父指针
factory= new HpFactory; //创建Hp工厂
mouse = factory -> CreactMouse(); //Hp工厂生产鼠标
mouse->ShowName(); //出来的是惠普的鼠标
keyboard =factory -> CreactKeyboard(); //Hp工厂生产的键盘
keyboard->ShowName(); //出来的是惠普的键盘
delete factory;
delete mouse;
delete keyboard;
return 0;
}
结果:
产品族、产品等级结构概念:
- 优点:
(1)当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用
某一族的产品。
(2)产品等级结构添加方便,符合开闭原则。 - 缺点:
(1)产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的工厂
里面添加代码,又要再具体工厂实现中添加代码,还得再实现一个产品。
产品族难扩展,产品等级易扩展
- 使用场景:
(1)系统中有多于一个的产品族,而系统只消费其中某一族的产品。
(2)产品具有多层等级结构