跟着老侯玩编程 跟着老侯玩编程
首页
  • 基础语法
  • 设计模式
  • 基础语法
  • 课程目录
  • 码农宝典
网盘 (opens new window)
留言
首页
  • 基础语法
  • 设计模式
  • 基础语法
  • 课程目录
  • 码农宝典
网盘 (opens new window)
留言
  • 基础语法

    • 单元文件
    • 变量和常量
    • 内联变量
    • 基本数据类型
    • 复合数据类型
    • 语句(选择语句)
    • 语句(循环语句)
    • 数组
    • 初识例程
    • 初识面向对象
    • 属性Property
    • 面向对象的方法
    • 指针
    • 接口
    • 匿名函数和委托实现
    • 多态
    • 字符串详解
    • 异常处理
    • 反射机制
    • 泛型容器
    • JSON
    • 文件操作
    • Dll创建并调用
    • DLL初始化和退出处理
    • Package
    • 理解消息循环
    • VCL与Windows消息
    • 钩子原理
    • 进程通讯-内存映像
    • 多线程开篇
    • 线程控制
    • 线程同步
  • 设计模式

    • 单例模式
    • 单例模式二
    • 策略模式
    • 简单工厂模式
      • 优点
      • 缺点
      • 应用场景
      • 实现
      • 调用
    • 建造者模式
    • 原型模式
    • 模板方法模式
    • 状态模式
    • 迭代器模式
    • 解释器模式
    • 责任链模式
    • 中介者模式
    • 备忘录模式
    • 命令模式
    • 观察者模式
    • 访问者模式
    • 适配器模式
    • 桥接模式
  • Delphi
  • 设计模式
舞动的代码
2022-04-29

简单工厂模式

​工厂模式(Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

# 优点

  1. 一个调用者想创建一个对象,只要知道其名称就可以了

  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以

  3. 屏蔽产品的具体实现,调用者只关心产品的接口

# 缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

# 应用场景

  1. 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方

  2. 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

# 实现

unit UnitLogger;
​
interface
​
uses
    System.SysUtils;
​
type
    {日志接口}
    ILogger = interface(IUnKnown)
        ['{2C7DD96A-795F-4D8A-99C7-EC7D4CD9F475}']
        procedure Log();
    end;
​
    {硬盘的实现方式}
    TDiskLogger = class(TInterfacedObject, ILogger)
    public
        procedure Log(); overload;
    end;
​
    {控件的实现方式}
    TComponentLogger = class(TInterfacedObject, ILogger)
        procedure Log(); overload;
    end;
​
    {定义工厂类}
    TLoggerFactory = class(TObject)
    public
        class function GetLogger(LoggerType: Integer): ILogger;
    end;
​
implementation
​
{ TDiskLogger }
​
procedure TDiskLogger.Log;
begin
    Writeln('将日志写入硬盘');
end;
​
{ TComponentLogger }
​
procedure TComponentLogger.Log;
begin
    Writeln('将日志在控件上进行展示');
end;
​
​
{ TLoggerFactory }
class function TLoggerFactory.GetLogger(LoggerType: Integer): ILogger;
begin
    case LoggerType of
        1:
            begin
                Result := TDiskLogger.Create();
            end;
        2:
            begin
                Result := TDiskLogger.Create();
            end;
​
    else
        raise Exception.Create('类型非法');
    end;
end;
​
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

# 调用

program Project1;
​
{$APPTYPE CONSOLE}
​
{$R *.res}
​
uses
    System.SysUtils,
    UnitLogger in 'UnitLogger.pas';
​
begin
    try
        var Logger := TLoggerFactory.GetLogger(1);
        Logger.log();
​
    except
        on E: Exception do
            Writeln(E.ClassName, ': ', E.Message);
    end;
​
    readln;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

以上就是工厂模式的简单使用,其实工厂类中的方法最好利用RTTI机制实现对象创建,这样具体的对象就可以实现定制化

上次更新: 2022/05/05, 14:24:28
策略模式
建造者模式

← 策略模式 建造者模式→

Theme by Vdoing | Copyright © 2013-2022 冀ICP备16006233号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×