简单工厂模式(Simple Factory Pattern)
概述:
1)定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例都具有共同的父类。
特点:
1)在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)。
2)需要什么,只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其实现过程。
例子:
1 #include <iostream> 2 using namespace std; 3 4 //IPhone产品 5 typedef enum _tagPhoneEnum 6 { 7 IPhoneX, 8 IPhone11, 9 IPhone7, 10 }PhoneEnum; 11 12 13 //IPhone各个产品手机共有特性 14 class IPhone 15 { 16 public: 17 virtual int Price() = 0;//价钱 18 }; 19 20 //IPhoneX 手机 21 class CIPhoneX:public IPhone 22 { 23 public: 24 virtual int Price() 25 { 26 return 5000; 27 } 28 }; 29 30 //IPhone11 手机 31 class CIPhone11:public IPhone 32 { 33 public: 34 virtual int Price() 35 { 36 return 6000; 37 } 38 }; 39 40 //IPhone手机工厂 41 class IPhoneFactory 42 { 43 public: 44 IPhone* GetPhone(PhoneEnum type) 45 { 46 switch (type) 47 { 48 case IPhone11://IPhone11 49 return new CIPhone11(); 50 case IPhoneX://IPhoneX 51 return new CIPhoneX(); 52 default://无法生产 53 cout << "不能生产该型号产品!" << endl; 54 return NULL; 55 } 56 } 57 }; 58 59 60 int main(int argc,char **argv) 61 { 62 IPhoneFactory* factory = new IPhoneFactory();//IPhone工厂 63 IPhone* iphone = factory->GetPhone(IPhone11);//生产IPhone11 64 if (NULL != iphone) 65 { 66 cout << iphone->Price() << endl; 67 delete iphone; 68 } 69 70 iphone = factory->GetPhone(IPhoneX);//生产IPhone11 71 if (NULL != iphone) 72 { 73 cout << iphone->Price() << endl; 74 delete iphone; 75 } 76 77 iphone = factory->GetPhone(IPhone7);//生产IPhone7 78 if (NULL != iphone) 79 { 80 cout << iphone->Price() << endl; 81 delete iphone; 82 } 83 84 return 0; 85 }
通过以上例子我们可以看到简单工厂模式有以下优缺点:
优点:
1)工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责。
2)客户端无需知道所创建具体产品的类名,只需知道参数即可。
3)也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。
缺点:
1)工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响。
2)使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度。
3)系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂。
4)违反开放-封闭原则(Open Closed Principle:对于扩展是开放的,对于修改是封闭的)。