添砖加瓦:设计模式(简单工厂模式)

  1、简单工厂模式中的角色和职责:

  工厂角色:简单工厂模式的核心,负责实现创建所有的实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象

  抽象产品角色:简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口

  具体产品角色:简单工厂模式所创建的具体实例对象

  2、简单工厂模式的优缺点:

  优点

  (1)实现了对象的创建和使用的分离

  (2)不需要记住具体类名,只需记住参数即可,减少记忆量

  缺点

  (1)工厂类的职责过重,一旦不能工作,系统会受到影响

  (2)增加系统中类的个数,复杂度和理解难度增加

  (3)违反“开闭原则”,增加新产品需要修改工厂逻辑,导致工厂越来越复杂

  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 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 }
View Code

 

posted @ 2017-10-22 21:34  落雷  阅读(183)  评论(0编辑  收藏  举报