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

  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 @   落雷  阅读(190)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示