设计模式、用Delphi实现---->Singleton 模式

Delphi多个DLL共享全局数据Demo 立即下载

Singleton模式

起源

Delphi的SINGLETON模式是在SINGLETON的基础上进行了扩展。更多SINGLETON模式的资料请参阅 《设计模式84页》

目的

保证一个类仅有一个实例,并提供一个访问它的全局访问点,一个相对简单的应用型设计模式

动机

此模式最重要的是保证大量类正确的访问单个实例。尽管一台个系统可能有多台打印机,但系统只允许有且只有一个打印缓存。同样比如:一个系统只有一个文件系统、一个窗体管理系统。对于Delphi的VCL来说:大家天天接触的Tapplication,Tscreen,Tclipboard都是。此模式更好的是使你可以在任何时候为你的应用程序提供一个全局对象。其它的用途:可以、提供一些全局的异常句柄,安全控制,为跨进程提供单一的访问点。

怎样保持一个类只有一个实例并且建立好的访问性能?一个全局变量保证了实例的可访问性,但还没有保证多个实例的同时存大的可能。

一个好的解决方案:建立类自身来负责保持自身一个实例的机制。类的第一个实例能保存不会再有类的实例被创建(在创建类的新实例时请求被中段)。并提供一个访问类的方法。这就是我们的singleton模式,典型的应用是建立服务型的的类。

 

应用

假设有一个用于显示时间进度低级服务类Tprogressor。类包括两个典型的方法:StartProgress, EndProgress, Abort 和一些常用的属性如:Progress, Aborted其它。

下面代码是Tprogressor类的接口部份

type

  TProgressor = class (TObject)

  private

    FProgress: Integer;

  protected

    procedure SetProgress(Value: Integer);

  public

»   procedure StartProgress;

»   property Progress: Integer read FProgress write SetProgress;

  end;

 

下面的代码是应用了singleton模式后的类的的接口部份。

type

  TProgressor = class (TObject)

  private

    FProgress: Integer;

  protected

    constructor CreateInstance;

    class function AccessInstance(Request: Integer): TProgressor;

    procedure SetProgress(Value: Integer);

  public

    constructor Create;

    destructor Destroy; override;

    class function Instance: TProgressor;

    class procedure ReleaseInstance;

»   procedure StartProgress;

»   property Progress: Integer read FProgress write SetProgress;

  end;

 

类接口部份的介绍:

·      方法class function Instance用于访问类的单件的实例。此方法一般在第一时间访问,类的实例被创建。

·      类构造器被重载,如果你尝试着不通过instance方法来构建一个新的实例将会抛出一个异常。

·      可通过调用ReleaseInstance来清除单件类存在的实例。一般在你要清除部件时调节器用些方法。在Delphi 1 exit过程中调用,在Delphi 2/3/4/5/6中在单元finalization中调用。不要访问TProgressor.Instance.Free来清除实例,

 

现在让我们来看看singleton模式实现。

constructor TProgressor.Create;

begin

  inherited Create;

  raise Exception.CreateFmt('Access class %s through Instance only',

      [ClassName]);

end;

 

constructor TProgressor.CreateInstance;

begin

  inherited Create;

end;

 

destructor TProgressor.Destroy;

begin

  if AccessInstance(0) = Self then AccessInstance(2);

  inherited Destroy;

end;

 

class function TProgressor.AccessInstance(Request: Integer): TProgressor;

  const FInstance: TProgressor = nil;

begin

  case Request of

    0 : ;

    1 : if not Assigned(FInstance) then FInstance := CreateInstance;

    2 : FInstance := nil;

  else

    raise Exception.CreateFmt('Illegal request %d in AccessInstance',

        [Request]);

  end;

  Result := FInstance;

end;

 

class function TProgressor.Instance: TProgressor;

begin

  Result := AccessInstance(1);

end;

 

class procedure TProgressor.ReleaseInstance;

begin

  AccessInstance(0).Free;

end;

 

procedure TProgressor.SetProgress(Value: Integer);

begin

»加入实现代码

end;

 

procedure TProgressor.StartProgress;

begin

»加入实现代码

end;

 

此模式的密秘在AccessInstance方法,AccessInstance方法使用了常量来存放实例。

由于Delphi不支持静态类字段的原因,你必需使用此方法。AccessInstance根据请求的参数来确认不同的返回方式,返回当前实例(Request = 0),创建一个实例(Request = 1),重置实例(Request = 2)。Delphi 2/3/4/5/6中,你必须将编译器设置$J+来支持形式常量(参见Delphi在线帮助)

将CreateInstance设成保护方法(protected),我们确保了其它类不能调用类的构造器。但由于构造函数本身为虚函数的原因,它可以被后代重载。例中,当第一次调用类实例时将确认类的具体类型。

唯一需要你手动添加的代码是:在单元的initialization或finalization加入清除代码。

下面是应用实例(Delphi1.0)

 

unit ProgressorTest;

 

...

...

 

implementation

 

...

...

 

procedure ShutDown; far;

begin

» TProgressor.ReleaseInstance;

end;

 

initialization

MMWIN:START INITIALIZATION

» AddExitProc(ShutDown);

end.

 

具体操作Tprogressor的代码:

 

procedure TSomeClass.DoSomething;

var I: Integer;

begin

» TProgressor.Instance.StartProgress;

» for I := 0 to 100 do

» begin

»   TProgressor.Instance.Progress := I;

» ..{ 完成其它的工作}

» end;

» TProgressor.Instance.EndProgress;

end;

Delphi实例

正在组织

Delphi全局对象的创建 全局对象在什么时候创建也是有讲究的,如果在调用之前尚未创建肯定会报错,那么下面通过调用函数间接调用全局对象的方法就不会有任何问题了。 var FUserInfo: TUserInfo = nil; function UserInfo: TUserInfo; begin if not Assigned(FUserInfo) then FUserInfo := TUserInfo.Create; Result := FUserInfo; end; 立即下载

相关推荐

Delphi设计模式重构:策略模式替代复杂条件分支的工程实践.pdf

文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 如果你正在寻找一种高效、强大的编程语言来开发跨平台应用,那么Delphi绝对值得考虑!它拥有直观的可视化开发环境,让代码编写变得轻松简单。凭借着快速的编译速度和卓越的性能优化,Delphi能够帮助开发者迅速构建出高质量的应用程序。无论是Windows、macOS、iOS还是Android平台,Delphi都能完美支持,真正实现一次编写,多平台部署。选择Delphi,开启高效开发之旅!

Delphi版设计模式

用delphi诠释设计模式

QAQ的小耗子的博客 553

WebVTT中的文本轨道(Text Tracks,TT)到底是什么鬼?

WebVTT,全称是The Web Video Text Tracks Format,意思是网络视频文本轨道格式。那么到底什么是文本轨道(Text Tracks)呢?这篇文章希望一探究竟。

码农1479的博客 1985

Delphi版设计模式之单例二

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

舞动的代码 579

SpringBoot整合oceanbase,实现oracle无缝切换到oceanbase

随着去“IOE”化的潮流,近些年来,许多与国家相关的项目不约而同到地往”国产化“方向靠拢,不可避免地,一些项目可能需要进行数据库迁移。

4623

【电子元件篇】电容的九大作用与选型指南-超简单解读

本文系统介绍了电容的基础概念、核心功能及实际应用。电容作为存储电荷的被动元件,其容值公式为C=Q/V,单位包括法拉及常用派生单位。文章重点解析了电容的九大功能:滤波(通过RC低通电路抑制噪声)、耦合(传递交流隔离直流)、去耦(稳定供电)、储能(短暂供电)、定时(RC延时)、谐振(RLC振荡)、旁路(高频通路)、电压调节(DC-DC转换)以及保护(吸收浪涌)。同时详细阐述了电容分类(陶瓷/电解/薄膜等)、参数选型要点(耐压/容值/精度/温度)及PCB设计注意事项,并针对不同应用场景提供了具体选型建议和常见误区

2301_81299416的博客 4011

设计模式、用Delphi实现---->Wrapper pattern

Wrapper pattern起源Delphi中的Wrapper模式是在 ‘Adapter’ or ‘Wrapper’ 的基础上上改造的。更多的介绍请查阅[Gam+, pages 139..150]。目的 ‘将一个接口转换成客户期待的别外一个接口。Wrappers 模式使得原本由于接口不兼容而不能一起工作类可以一起工作,参阅 [Gam+ 139].动机在Delphi的O

programlover的专栏 1008

红队攻防渗透技术实战流程:云安全之云原生安全:特权模式和挂载模式

红队云攻防实战1. 什么是云 1. 什么是云

HACKONE的博客 573

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之SimpleRemoteControlTest [转]...

//命令的接受者 unit uReceiveObject; interface type TLight = class(TObject) public procedure Open; procedure Off; end; TGarageDoor = class(TObject) public procedure Up; procedure Down...

weixin_30872789的博客 135

一文讲透 SAP VDM 命名里的前缀与后缀:看懂 I_、C_、A_,把 CDS 视图栈搭得又稳又好用

SAP S/4HANA 的 CDS 视图命名规范解析 摘要:本文详细解析 SAP S/4HANA 中 CDS 视图的 VDM 命名规范。通过前缀(如 I_、C_、R_)区分视图层级,后缀标记附加角色,结合 @VDM.viewType 注解形成完整语义体系。I_作为稳定接口层,C_面向特定场景裁剪,R_限定应用域内复用,A_提供远程 API 接口。命名规范使团队能快速识别视图用途、依赖关系和扩展边界,确保模型长期可维护性。文章结合制造业物料主数据、Fiori 应用等实际案例,说明如何通过规范命名构建清晰的视图

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 220

[ 人力资源面试篇 ] HR 面试题分析详解大集合,看完直怼面试官(二)

那么在这个系列的文章中,我们聊到 HR 面谈什么?并且总结了五十个常见的人力资源面试题,在这里分享给大家。

qq_51577576的博客 1380

设计模式---Delphi 篇

本文以“观察者”设计模式介绍 “对象--关系映射 ORM ”下面以Delphi  tiOPF 框架实现原理介绍:Abstract the Visitor logicBefore we go any further, we must abstract the Visitor functionality away from the business objects so we never

Mr.Kim.Wu 的日记 1367

MTK Meta ISP 工具使用技巧与参数读取路径全解析

在联发科(MediaTek, MTK)平台上进行相机图像调试时,Meta ISP 工具是连接 PC 与设备进行参数调整、寄存器读取和图像输出的重要工具。本文以实战角度出发,系统梳理 Meta ISP 的使用流程、关键模块功能、典型调试技巧与参数读取路径,结合最新版平台(如MTK Genio/Dimensity 系列)架构,帮助工程师掌握联发科图像调优的核心流程。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1148

设计模式、用Delphi实现---->Singleton 模式 (转)

设计模式、用Delphi实现----&gtSingleton 模式 (转)[@more@]Singleton模式 起源 Delphi的SINGLETON模式是在SINGLETON的基础上进行了扩展。更多SINGLET...

csobhtdx34120的博客 163

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook

模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override)。 1.CoffeineBeverageWithHook {《HeadFirst设计模式》之模板方法模式 } { 编译工具: Delphi7.0 } { E-Mail : xshlife@163.com } unit uCoffeineBeve

djCode 733

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

《大话设计模式》之 简单工厂模式 Delphi/C shap /JAVA 实现

{计算器的功能实现 实现工厂设计模式 通过面向对象的思想,进行设计,所用的编程思想为对象的三大特性:封装,继承,多态 通过实现一个简单的 计算器的功能(输入两个数,进行加,减,乘,除) 思想思路: 1.设计虚拟父类; 2.子类继承父类 3. 通过虚拟方法,进行进行重载 4.工厂类,实例化对象,采用多态 }unit uOperation;i

tjb_1216的专栏 2314

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Delphi面向对象设计:如何构建优雅的类结构

职责明确的边界清晰的扩展方便的使用简单的维护轻松的记住:代码首先是给人读的,其次才是给机器执行的。即使是在强调性能的Delphi开发中,良好的设计也能带来长期的可维护性优势。

mgcps的专栏 359

Delphi五种设计模式

<br />今天抽空浏览了一下Delphi写的设计模式,网页在如下位置:<br />http://www.delphi-jedi.org/art_patterns.html<br />今天再看。仍然有种感觉。我把Observer模式的代码补充到下面。在Delphi 7已经编译通过。Lazarus应该也没有问题。<br />unit Unit2;<br />interface<br />type<br />TObservable = class;<br />TObserver = class;<br />TO

astra_zhao的专栏 2352

设计模式、用Delphi实现---->Template Method模式

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 605

设计模式、用Delphi实现---->Decorator 模式

   Decorator 模式起源Delphi的Decorator模式是在Decorator的基础上进行了扩展。更多Decorator模式的资料请参阅 《设计模式115页》目的动态地给一个对象添加一些职责。就增加功能来说,Decorator模式比增加子类更为灵活.动机我们经常要为某一些个别的对象增加一些新的职责,并不是全部的类。假设,我们有一组类用来输出文本行。

programlover的专栏 5175

用 Delphi 学设计模式(二) 之 工厂方法篇

“开闭原则”:一个模块应该易于扩展,免于修改 问题:请考虑上一章的例子中,如果添加一个新的具体水果类“西瓜”需要做哪些工作。 本章完成以下内容: 1、代码用支持中文的 Delphi 2005 编译并通过,并去除了其中一些无关紧要的地方,如异常处理等 ; 2、重新设计一个情景,分别用“简单工厂模式”和“工厂方法模式”两种方法实现,请体...

weixin_30606669的博客 174

Delphi语言的编程范式

Delphi语言是Object Pascal的一个扩展,结合了结构化编程、面向对象编程(OOP)和事件驱动编程等多种编程范式。以其简洁明了的语法和强大的类库,Delphi使开发人员可以高效地开发Windows应用程序、Web应用程序以及移动应用程序。Object Pascal在Pascal语言的基础上增添了面向对象编程的特性,例如类、继承、多态和封装等。这些特性使得程序的结构更清晰、可维护性更高。同时,Object Pascal也支持异常处理、集合、接口等特性。

2501_90394924的博客 949

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

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

每天一小步 1409

Delphi版设计模式之单例一

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

舞动的代码 890
上一篇: 设计模式、用Delphi实现----&gt;Strategy模式
下一篇: 设计模式、用Delphi实现---->Template Method模式
programlover
博客等级 码龄26年 1粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值