添砖加瓦:设计模式(工厂方法模式)
Posted 落雷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了添砖加瓦:设计模式(工厂方法模式)相关的知识,希望对你有一定的参考价值。
1、工厂方法模式中的角色和职责
抽象工厂角色:工厂方法模式的核心,任何工厂类都必须实现这个接口。
工厂角色:具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
抽象产品角色:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品角色:工厂方法模式所创建的具体实例对象。
简单工厂模式 + “开闭原则” = 工厂方法模式
2、工厂方法模式优缺点
优点:
(1) 不需要记住具体类名,甚至连具体参数都不用记忆。
(2) 实现了对象创建和使用的分离。
(3)系统的可扩展性也就变得非常好,无需修改接口和原类。
缺点:
(1)增加系统中类的个数,复杂度和理解难度增加。
(2) 增加了系统的抽象性和理解难度。
3、适用场景
(1)客户端不知道它所需要的对象的类。
(2) 抽象工厂类通过其子类来指定创建哪个对象 、
4、实例
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 */ 18 class abstractFactory 19 { 20 public: 21 virtual Work *createJob() = 0; 22 }; 23 24 //实例 25 class Salesman :public Work 26 { 27 public: 28 virtual void job() 29 { 30 cout << "I`m a Salesman" << endl; 31 } 32 }; 33 34 //实现抽象工厂,返回抽象工作指针 35 class abstractSalesman : public abstractFactory 36 { 37 public: 38 virtual Work *createJob() 39 { 40 return new Salesman; 41 } 42 }; 43 44 /* 45 此时,若想添加一个医生类,那么只需要实现一个医生工厂和一个医生具体类,并不需要修改已有的代码 46 */ 47 class Doctor : public Work 48 { 49 virtual void job() 50 { 51 cout << "I`m a Doctor" << endl; 52 } 53 }; 54 class abstractDoctor : public abstractFactory 55 { 56 public: 57 virtual Work *createJob() 58 { 59 return new Doctor; 60 } 61 }; 62 63 int main(int argc, char* argv[]) 64 { 65 /* 66 依赖倒转原则, 是针对接?的编程, 67 那么,何为针对接?? 68 即只需要 使? 抽象??类的指针,和抽象?果类的指针, 69 通过多态的特性,就可以搞定完成具体类的业务。 70 */ 71 72 abstractFactory *abFactory = NULL; 73 Work *work = NULL; 74 75 /* 76 使用抽象指针完成售货员业务 77 */ 78 abFactory = new abstractSalesman; 79 work = abFactory->createJob(); 80 work->job(); 81 delete abFactory; 82 delete work; 83 84 /* 85 使用抽象指针完成医生业务 86 */ 87 abFactory = new abstractDoctor; 88 work = abFactory->createJob(); 89 work->job(); 90 delete abFactory; 91 delete work; 92 93 94 getchar(); 95 return 0; 96 }
以上是关于添砖加瓦:设计模式(工厂方法模式)的主要内容,如果未能解决你的问题,请参考以下文章