设计模式 C++抽象工厂模式
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 C++抽象工厂模式相关的知识,希望对你有一定的参考价值。
抽象工厂模式
抽象工厂模式是工厂方法模式的泛化版,工厂方法模式是一种特殊的抽象工厂模式。在工厂方法模式中,每一个具体工厂只能生成一种具体产品,而在抽象工厂方法模式中,每一个具体工厂可以生成多个具体产品。在实际的软件开发中,抽象工厂模式使用频率较高
我们先来搞懂产品族和产品等级结构
产品族就相等于一个工厂所产生的产品;产品等级结构则是不同的产品;例如华为的手机,路由器,电脑就是一个产品族;而手机,路由器,电脑就形成三个产品等级结构,各有各的产品等级结构
抽象工厂模式包含4个角色
AbstractFactory(抽象工厂):抽象工厂用于声明生成抽象产品的函数,在一个抽象工厂中可以定义一组函数,每一个函数对应一个产品等级结构
ConcreateFactory(具体工厂):具体工厂重写抽象工厂声明的生成抽象产品的函数,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中
AbstractProduct(抽象产品):在抽象产品中定义产品的抽象业务函数
ConcreateProduct(具体产品):具体产品定义具体工厂生成的具体产品对象,重写抽象产品接口中定义的业务函数
抽象工厂模式结构图
我们用华为和苹果来举例并写出代码
1、抽象产品
//抽象产生--手机
class Phone
{
public:
//抽象业务函数--听音乐
virtual void listenMusic() = 0;
};
//抽象产品--电脑
class Computer
{
public:
//抽象业务函数--打游戏
virtual void playGame() = 0;
};
2、抽象工厂
//抽象工厂
class Factory
{
public:
//生产抽象产品--生产手机
virtual Phone* createPhone() = 0;
//生产抽象产品--生产电脑
virtual Computer* createComputer() = 0;
};
3、具体产品
//具体产品--华为手机
class HuaweiPhone : public Phone
{
public:
//重写抽象产品中的业务函数
virtual void listenMusic()
{
cout << "拿着华为手机听音乐" << endl;
}
};
//具体产品--华为电脑
class HuaweiComputer : public Computer
{
public:
//重写抽象产品中的业务函数
virtual void playGame()
{
cout << "拿着华为电脑打游戏" << endl;
}
};
//具体产品--苹果手机
class ApplePhone : public Phone
{
public:
//重写抽象产品中的业务函数
virtual void listenMusic()
{
cout << "拿着苹果手机听音乐" << endl;
}
};
//具体产品--苹果电脑
class AppleComputer : public Computer
{
public:
//重写抽象产品中的业务函数
virtual void playGame()
{
cout << "拿着华为电脑打游戏" << endl;
}
};
4、具体工厂
//具体工厂--华为工厂
class HuaweiFactory : public Factory
{
public:
//重写抽象工厂中的生产手机
virtual Phone* createPhone()
{
return new HuaweiPhone();
}
//重写抽象工厂中的生产电脑
virtual Computer* createComputer()
{
return new HuaweiComputer();
}
};
//具体工厂--苹果工厂
class AppleFactory : public Factory
{
public:
//重写抽象工厂中的生产手机
virtual Phone* createPhone()
{
return new ApplePhone();
}
//重写抽象工厂中的生产电脑
virtual Computer* createComputer()
{
return new AppleComputer();
}
};
测试代码
int main()
{
//创建华为工厂
Factory* huaweiFactory = new HuaweiFactory();
//华为工厂生产手机
Phone* huaweiPhone = huaweiFactory->createPhone();
//华为的手机听音乐
huaweiPhone->listenMusic();
//华为工厂生产电脑
Computer* huaweiComputer = huaweiFactory->createComputer();
//华为的电脑打游戏
huaweiComputer->playGame();
//创建苹果工厂
Factory* appleFactory = new AppleFactory();
//苹果工厂生产手机
Phone* applePhone = appleFactory->createPhone();
//苹果的手机听音乐
applePhone->listenMusic();
//苹果工厂生产电脑
Computer* appleComputer = appleFactory->createComputer();
//苹果的电脑打游戏
appleComputer->playGame();
return 0;
}
运行结果:
总结:
抽象工厂模式的优点:
1、抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都重写了抽象工厂中定义的函数,因此只需要改变具体工厂的实例,就可以在这种某种程度上改变整个软件系统的行为。另外应用抽象工厂模式可以实现高内聚,低耦合的设计目的,因此抽象工厂模式得到了广泛的应用
2、当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”
抽象工厂模式的缺点:
在添加新的产品对象时,难以扩展抽象工厂来产生新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该抽象类进行扩展,而这将涉及对抽象工厂角色及其所有子类的修改,显然会带来较大的不便
以上是关于设计模式 C++抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章