抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合。
设计原则:遵循单一职责、依赖倒置、开闭原则
常用场景:需要一个接口可以提供一个产品族,且不必知道产品的具体种类
变化点:工厂与产品的种类
选择关键点:产品族是否需要一起提供,且是否有一致的接口
假如我们需要各种水果(如apple),那么做法是:
1.首先需要一个苹果工厂类,从抽象工厂类继承;
2.来一个苹果,苹果工厂只能生产苹果(苹果工厂的生产器只能生产苹果)。
抽象工厂模式结构图:
实现代码:
1 #include<iostream> 2 //工厂方法模式 3 using namespace std; 4 class Fruit { 5 public: 6 virtual void getName() = 0; 7 }; 8 9 class Apple :public Fruit { 10 virtual void getName(){ 11 cout << "I'am apple." << endl; 12 } 13 }; 14 15 class Banana :public Fruit { 16 virtual void getName() { 17 cout << "Banana." << endl; 18 } 19 }; 20 21 class AbstractFactory { 22 public: 23 virtual Fruit* CreateFruit() = 0; 24 }; 25 26 class AppleFactory :public AbstractFactory { 27 public: 28 virtual Fruit* CreateFruit() { 29 return new Apple; 30 } 31 }; 32 33 class BananaFactory :public AbstractFactory { 34 public: 35 virtual Fruit* CreateFruit() { 36 return new Banana; 37 } 38 }; 39 40 int main(void) 41 { 42 AbstractFactory* af = new AppleFactory; 43 Fruit * apple = af->CreateFruit(); 44 apple->getName(); 45 delete af; 46 delete apple; 47 48 AbstractFactory* bf = new BananaFactory; 49 Fruit * banana = bf->CreateFruit(); 50 banana->getName(); 51 delete bf; 52 delete banana; 53 54 return 0; 55 }
测试结果: