
设计模式 C++抽象工厂模式
发布日期:2021-05-07 22:59:43
浏览次数:24
分类:精选文章
本文共 2634 字,大约阅读时间需要 8 分钟。
抽象工厂模式是工厂方法模式的泛化版,一种常见的设计模式。在工厂方法模式中,每个具体工厂只能生成一种特定产品,而抽象工厂模式则允许每个具体工厂生成多种产品。这种模式在软件开发中被广泛应用。
产品族与产品等级结构
产品族指的是由一个工厂生成的所有产品,而产品等级结构则是不同产品之间的分类。以华为和苹果为例,手机、路由器、电脑可以看作是三个不同的产品等级结构,而它们都属于同一个产品族——智能设备。
抽象工厂模式的四个角色
抽象工厂 (AbstractFactory):声明生成抽象产品的方法,通常会定义一组方法,每个方法对应一个产品等级结构。
具体工厂 (ConcreateFactory):重写抽象工厂中的方法,生成具体的产品。这些具体产品构成了一个完整的产品族,每个产品都属于特定的产品等级结构。
抽象产品 (AbstractProduct):定义产品的抽象功能和接口。
具体产品 (ConcreateProduct):实现抽象产品的接口,具体描述由某个具体工厂生成的产品。每个具体产品通常会重写其对应的抽象产品功能。
抽象工厂模式的实现示例
以华为和苹果为例,我们可以设计以下类结构:
-
抽象产品类:
//抽象产品--手机class Phone {public: //抽象业务函数--听音乐 virtual void listenMusic() = 0;};//抽象产品--电脑class Computer {public: //抽象业务函数--打游戏 virtual void playGame() = 0;};
-
抽象工厂类:
//抽象工厂class Factory {public: //生产抽象产品--手机 virtual Phone* createPhone() = 0; //生产抽象产品--电脑 virtual Computer* createComputer() = 0;};
-
具体产品类:
//具体产品--华为手机class HuaweiPhone : public Phone {public: //重写抽象产品中的业务函数 void listenMusic() { cout << "拿着华为手机听音乐" << endl; }};//具体产品--华为电脑class HuaweiComputer : public Computer {public: //重写抽象产品中的业务函数 void playGame() { cout << "拿着华为电脑打游戏" << endl; }};//具体产品--苹果手机class ApplePhone : public Phone {public: //重写抽象产品中的业务函数 void listenMusic() { cout << "拿着苹果手机听音乐" << endl; }};//具体产品--苹果电脑class AppleComputer : public Computer {public: //重写抽象产品中的业务函数 void playGame() { cout << "拿着苹果电脑打游戏" << endl; }};
-
具体工厂类:
//具体工厂--华为工厂class HuaweiFactory : public Factory {public: //重写抽象工厂中的生产手机 Phone* createPhone() { return new HuaweiPhone(); } //重写抽象工厂中的生产电脑 Computer* createComputer() { return new HuaweiComputer(); }};//具体工厂--苹果工厂class AppleFactory : public Factory {public: //重写抽象工厂中的生产手机 Phone* createPhone() { return new ApplePhone(); } //重写抽象工厂中的生产电脑 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;}
优缺点总结
抽象工厂模式的主要优点在于它提供了高度的灵活性和可扩展性。具体工厂可以通过简单地替换抽象工厂的实例来改变整体系统的行为,这有助于实现高内聚、低耦合的设计原则。同时,增加新的具体工厂或产品族只需扩展抽象工厂的结构,完全符合“开闭原则”。
然而,抽象工厂模式也存在一定的缺陷。特别是在需要添加新的产品对象时,抽象工厂的结构需要进行修改,这可能会带来较大的不便。因此,在实际应用中,需要根据具体需求权衡优缺点。