Delphi 实现单例模式(Singleton Pattern)

Delphi语言的面向对象编程 Delphi中,类是使用class关键字定义的。以下是一个简单的类定义示例:```delphitypeprivatepublicend;beginend;beginend;```Delphi的面向对象编程提供了强大而灵活的功能,使得开发人员能够以模块化和可复用的方式进行软件开发。通过封装、继承、多态和抽象等特性,我们可以构建维护性高、易扩展的复杂应用程序。在实时项目中,有效地利用设计模式和异常处理机制,可以显著提升代码的质量和健壮性。 阅读详情

原文:http://www.faceker.com/200808/delphi-singleton-pattern.html

单例模式顾名思义就是一个实例,在任何情况下,系统中只能存在某一对象的一个实例。单例模式在应用开发中比较常见,如 Application 或 Logger。

在 Delphi 的以前版本中,实现单例模式比较“另类”,自从 Delphi 后期加入一些新的语法元素后,单例模式的实现显得更为标准,和 C++、Java 中的实现方法几乎一致,最主要原因就是 Delphi 加入了类变量的支持,关键字为”class var”。

Delphi 同时支持类属性,可以让单例的访问更为友好;同时需要注意,在实现单例模式时,一定不要忘记把类本身的 Create 构建函数隐藏,否则的话,单例的实现将没有意义。

下面的代码实现了单例模式的 TLogger:

unit LoggerService;

interface

uses
  SysUtils, Windows, Messages, Classes, Forms, Dialogs;

type
  TLogger = class ( TObject )
  private
    class var
      FInstance: TLogger;
    class function GetInstance: TLogger; static;
  protected
    constructor Create;
  public
    procedure Login;
    procedure Logout;
    class procedure ReleaseInstance;
    class property Instance: TLogger read GetInstance;
  end;


implementation

{
************************* TLogger *************************
}


constructor TLogger. Create;
begin
  ShowMessage ( 'Create...' );
end;

class function TLogger. GetInstance: TLogger;
begin
  if FInstance = nil then FInstance := TLogger. Create;
  Result := FInstance;
end;

procedure TLogger. Login;
begin
  ShowMessage ( 'Login...' );
end;

procedure TLogger. Logout;
begin
  ShowMessage ( 'Logout...' );
end;

class procedure TLogger. ReleaseInstance;
begin
  FreeAndNil (FInstance );
end;


end.

通过 TLogger.Instance 属性即可访问日志记录对象的唯一实例,使用 TLogger.ReleaseInstance 释放实例,当然通过 TLogger.Instance.Free 也可释放实例,但在 FInstance 为 Nil 的时候,此种释放方法会先构建一个实例然后再释放,所以 ReleaseInstance 是最佳选择。
Delphi 支持全局变量,如果觉得 TLogger.Instance 这种访问方法显得麻烦,可以定义一个 Logger 全局变量来访问实例,如下:

...
interface
...
var
  Logger: TLogger;
...
implementation
...
initialization
  Logger := TLogger. Instance;

finalization
  TLogger. ReleaseInstance;
  Logger := nil;
LabVIEW+数据库应用系列保姆级教程,第一篇数据库连接 目录LabVIEW连接数据库的方法连接MySQL连接Oracle,SQL Server,Access等 LabVIEW连接数据库的方法 1、创建udl(Universal Data Link)是通用数据连接文件。界面操作,简单快捷。 2、编写连接字符串。需要熟悉连接字符串的结构,容易出错。 3、其他… 本教程教你使用第1种方法,也是最简单、最常用的方法。 连接MySQL 1、在MySQL Installer内安装MySQL Connector/ODBC,建议安装32位(X86),如下图: 2、创建ODBC 阅读详情

相关推荐

开源DIY | 打造会“听”会“走”的智能移动垃圾桶

本文详细介绍了如何利用Arduino和超声波传感器打造一款会“听”会“走”的智能移动垃圾桶。通过开源硬件和简单编程,实现声控移动和自动避障功能,适合创客爱好者和家庭DIY。项目成本控制在200元内,涵盖硬件搭建、电路连接和核心功能实现,是入门级机器人制作的理想选择。

weixin_33670713的博客 200

设计模式之单例模式

1 单例模式简介 1.1 介绍   单例模式应该是日常使用最为广泛的一种模式了。他的作用是确保某个类只有一个实例,避免产生多个对象消耗过多的资源。比如对数据库的操作时;在一个应用中只有一个ImageLoader实例,这个ImageLoader又含有线程池、缓存系统、网络请求等,很消耗资源,就可以使用单例模式。 1.2 单例模式定义   确保某一个类只有一个实例,而且自行实例化并向整...

chenliguan的博客 3669

保证Delphi程序只运行一个实例的方法

然后,我们检查命名管道的创建结果,如果创建失败则表示已有实例在运行,此时我们关闭命名管道句柄并退出程序。然后,我们检查互斥体是否已经存在,如果存在则表示已有实例在运行,此时我们关闭互斥体句柄并退出程序。在Delphi中,有时我们希望确保我们的程序只能运行一个实例,以避免出现多个实例导致的问题。互斥体是一种在多线程编程中常用的同步对象,我们可以利用它来实现只允许一个实例运行的效果。在Delphi中,我们可以使用窗口类名来实现只允许一个实例运行的效果。如果存在,则发送自定义消息给已有实例,并退出程序。

2301_79325657的博客 495

Delphi版设计模式之单例一

可能Delphi王朝真的没落了,在网上查了很久都是一些重复、陈旧、残缺不全的帖子,搞的像古代的武功秘籍一样,每次只能获取上篇或者下篇,而这些上下还有可能是残篇 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 引自菜鸟教程 从上面的话中不难看出,所谓的设计模式是针对一些常见问题总结出来的一套比较优质的解决方案,所以

舞动的代码 884

delphi单例模式

unit Unit2; interface uses System.SysUtils; type { TSingle } TSingle = class(TObject) private FStr: string; protected public constructor Create; class function GetInstance():...

全粘工程师 902

Delphi设计模式之单例模式(Singleton Pattern)

<br /> Singleton Pattern模式的设计意图是:保证一个类仅有一个实例,并提供一个访问他的全局访问点。 <br />有人已经实现了这个模式,详见代码如下: <br />interfaceuses classes,SysUtils; type  TSingletonList = class(TList);   TSingletonl = class  public    constructor Create;virtual;    destructor Destroy; override; 

互联网产品管理、交互、设计、开发、用户体验专栏 1262

Design Pattern----06.Creational.Singleton.Pattern (Delphi Sample)

Intent Ensure a class has only one instance, and provide a global point of access to it. Encapsulated “just-in-time initialization” or “initialization on first use”. Problem Application need...

weixin_30919919的博客 150

设计模式、用Delphi描述-->Reference Count pattern

 Reference Count 模式(引用记数)起源Reference Count模式是一种相对简单,但实用性很强,比如COM中的引用记数就是COM生命周期控制的基础,同样也是Observer模式(详细请见Observer模式)的生命周期的基础。目的利用Reference Count的模式来控制对象的生命周期。对于引用记数中对象将是可利用的对象,否则对象将析构自身。动机

programlover的专栏 998

Design Pattern----11.Structural.Facade.Pattern (Delphi Sample)

Intent Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. Wrap a complicated subsystem with a simpl...

weixin_30865427的博客 181

QuickLib性能优化指南:让你的应用运行如飞

QuickLib是一款功能强大的跨平台开发库,支持Delphi/Firemonkey和Free Pascal,提供了AutoMapper、LinQ、IOC依赖注入、MemoryCache等丰富功能。本指南将分享实用的性能优化技巧,帮助你充分发挥QuickLib的潜力,让应用运行更加高效流畅。 ## 一、高效利用内存缓存(MemoryCache)提升响应速度 内存缓存是提升应用性能的关键组件,特

gitblog_00904的博客 623

编译器 | 从工业实现到极简设计 —— 编译器的多元形态与实践

……

u013669912的博客 794

十九、软考-系统架构设计师笔记-真题解析-2019年真题

A.分片模式B.全局外模式C.分布模式D.全局概念模式解析:

落日的博客 2064

设计模式学习笔记5:Singleton模式及其Delphi实现

Singleton(单件)模式是一种很有用的设计模式。它的意图的是:仅仅创建一个类的实例,并提供一个访问它的全局访问点。全局变量使的一个对象易被访问,但不能防止你实例化多个对象。单件模式的目的就是确保在程序的生命周期内只有一个实例存在。多实例实现了数据的并行访问,而单例模式是把它变成串行访问。所以这模式的用途非常的广泛,如处理数据库连接的访问等等。Delphi实现Singleton也有许多方案,在

每天一小步 1404

delphi单例模式TSingleton

<br />Delphi的机制和Java和C++不同,没有java的C++的静态方法,但是delphi有类方法。类方法可以通过类直接调用。但是由于类方法在调用时类本身没有创建,类的数据成员也就没有创建,这样就无法把创建的类的对象存在私有字段的数据成员中了。所有delphi单例模式实现起来就有点麻烦了。

dongyonggan的专栏 849

Delphi版设计模式之单例二

​接上篇Delphi版设计模式之单例一,细心的朋友可能发现我在上一篇文章中重写类NewInstance和FreeInstance函数,原因是:【在delphi中编译器对构造函数的保护级别进行了处理,即便设为private,编译器仍然会将其修正为public,所以覆盖基类中的NewInstance类方法,系统在每次构造对象时都会调用这个类方法,通过重载它就可以实现对构造函数的控制】,同时在上篇文章中有一段核心代码 我以注释的形式标注这里在并发环境下存在安全隐患,那么现在我们就通过多线程的方式研究一下这个问.

舞动的代码 575

Delphi语言的游戏设计模式

设计模式是针对特定问题的最佳解决方案,是经验丰富的开发者总结出的方法和技巧。在游戏开发中,设计模式能够帮助我们更直观地理解系统结构,提升团队协作效率,并减少后期维护的成本。在Delphi语言的游戏开发中,设计模式为我们提供了一种高效的开发手段。通过合理的模式选择和实现,我们能够显著提高代码的可读性、可维护性与可扩展性。希望本文对游戏开发者在Delphi中运用设计模式有所帮助,可以更好地应对游戏项目中的挑战。设计模式并非万无一失,在实际运用时,开发者需要根据具体的项目需求、团队技术积累等因素进行灵活调整。

2501_91390782的博客 594

事件声明与赋值

今天看到一朋友在问技术问题:TField事件赋值问题。问题如下 procedure fieldGetText(Sender: TField; var Text: string;   DisplayText: Boolean); begin   //text:= MyTextDEncrypt(Sender.AsString, 'xxxxxddddd'); end; procedure f

ghs79的专栏 1042

2023 UDS诊断服务列表汇总【个人总结汇总】

对UDS各类诊断服务进行汇总,可以用来学习,也可以直接进行查询。主要包括:SID(服务ID),诊断服务名,相应的说明解释,肯定响应,否定相应,是否支持子功能,子功能包括的值及说明,支持的否定响应码对UDS各类诊断服务进行汇总,可以用来学习,也可以直接进行查询。主要包括:SID(服务ID),诊断服务名,相应的说明解释,肯定响应,否定相应,是否支持子功能,子功能包括的值及说明,支持的否定响应码

上一篇: 字符编码:ASCII,Unicode和UTF-8
下一篇: Delphi 2009 初体验
桂林哈秋
博客等级 码龄24年 70粉丝 95原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值