引入
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。
概念
抽象工厂模式(
Abstract Factory Pattern
):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
角色
AbstractFactory
:抽象工厂ConcreteFactory
:具体工厂AbstractProduct
:抽象产品Product
:具体产品
场景
- 系统应独立于其产品的创建,组成和表示方式
- 系统应配置有多个产品系列之一
- 相关产品对象系列旨在一起使用
- 您想提供产品的类库,并且只想显示它们的接口,而不是它们的实现
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
//抽象产品类A class ProductA { public: virtual ~ProductA() {} virtual void show() = 0; }; //A的实例化:X class ConcreteProductAX : public ProductA { public: ~ConcreteProductAX() {} void show() { std::cout << "A:X" << std::endl; } }; //A的实例化:Y class ConcreteProductAY : public ProductA { public: ~ConcreteProductAY() {} void show() { std::cout << "A:Y" << std::endl; } }; //抽象产品类B class ProductB { public: virtual ~ProductB() {} virtual void show() = 0; }; //B的实例化:X class ConcreteProductBX : public ProductB { public: ~ConcreteProductBX() {} void show() { std::cout << "B:X" << std::endl; } }; //A的实例化:Y class ConcreteProductBY : public ProductB { public: ~ConcreteProductBY() {} void show() { std::cout << "B:Y" << std::endl; } }; //抽象工厂类 class AbstractFactory { public: virtual ~AbstractFactory() {} virtual ProductA * CreateProductA() = 0; virtual ProductB * CreateProductB() = 0; }; //工厂的实例化:用于生产X class ConcreteFactoryX : public AbstractFactory { public: ~ConcreteFactoryX() {} ProductA * CreateProductA() { return new ConcreteProductAX(); } ProductB * CreateProductB() { return new ConcreteProductBX(); } }; //工厂的实例化:用于生产Y、 class ConcreteFactoryY : public AbstractFactory { public: ~ConcreteFactoryY() {} ProductA * CreateProductA() { return new ConcreteProductAY(); } ProductB * CreateProductB() { return new ConcreteProductBY(); } }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
auto mian()->int { ConcreteFactoryX * factoryX = new ConcreteFactoryX(); ConcreteFactoryY * factoryY = new ConcreteFactoryY(); ProductA * p1 = factoryX->CreateProductA(); ProductB * p2 = factoryY->CreateProductA(); delete p1; delete p2; delete factoryX; delete factoryY; return 0; } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 创建型:建造者模式09/21
- ♥ 行为型:迭代器模式09/07
- ♥ 架构模式:MVVM模式07/27
- ♥ 行为型:中介者模式09/13
- ♥ 结构型:适配器模式09/19
- ♥ 结构型:代理模式09/23