添砖加瓦:设计模式(简单工厂模式)
1、简单工厂模式中的角色和职责:
工厂角色:简单工厂模式的核心,负责实现创建所有的实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象
抽象产品角色:简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口
具体产品角色:简单工厂模式所创建的具体实例对象
2、简单工厂模式的优缺点:
优点:
(1)实现了对象的创建和使用的分离
(2)不需要记住具体类名,只需记住参数即可,减少记忆量
缺点:
(1)工厂类的职责过重,一旦不能工作,系统会受到影响
(2)增加系统中类的个数,复杂度和理解难度增加
(3)违反“开闭原则”,增加新产品需要修改工厂逻辑,导致工厂越来越复杂
3、适用场景
(1)工厂类负责创建的对象较少。因为创建的对象少,所以不会造成工厂方法中的业务逻辑太过复杂
(2)客户端只知道传入工厂类的参数,对于如何创建对象并不关心
4、示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 //简单工厂模式 7 /* 8 * 定义一个人类抽象类,供具体工种实现和工厂使用 9 */ 10 class Work 11 { 12 public: 13 virtual void job() = 0; 14 }; 15 16 //实例 17 class Salesman :public Work 18 { 19 public: 20 virtual void job() 21 { 22 cout << "I`m a Salesman" << endl; 23 } 24 }; 25 26 class Doctor : public Work 27 { 28 virtual void job() 29 { 30 cout << "I`m a Doctor" << endl; 31 } 32 }; 33 34 //现在添加一个教师类,则只需要再创建一个教师类 35 class Teacher : public Work 36 { 37 virtual void job() 38 { 39 cout << "I`m a Teacher" << endl; 40 } 41 }; 42 43 //工厂类 44 class Factory 45 { 46 public: 47 Work* createWork(string work) 48 { 49 if (work == "Salesman") 50 return new Salesman; 51 else if (work == "Doctor") 52 return new Doctor; 53 /* 54 * 当创建新的工作时,Factory会变得越来越大,不符合开闭原则 55 */ 56 else if (work == "Teacher") 57 return new Teacher; 58 } 59 }; 60 61 int main(int argc, char* argv[]) 62 { 63 Factory *factory = new Factory; 64 Work *work = NULL; 65 66 /* 67 ⽤⼯⼚创建⼀个具体工作类,返回抽象类指针 68 那么这样就会发⽣多态。 69 此时抽象类指针指向了具体的⼦类,那么调⽤抽象⽅法 70 就会调⽤⼦类的实现⽅法。 71 */ 72 73 work = factory->createWork("Salesman"); 74 work->job(); 75 delete work; 76 work = NULL; 77 78 work = factory->createWork("Doctor"); 79 work->job(); 80 delete work; 81 work = NULL; 82 83 work = factory->createWork("Teacher"); 84 work->job(); 85 delete work; 86 work = NULL; 87 88 delete factory;//避免内存泄漏 89 90 getchar(); 91 return 0; 92 }