起源
Delphi的SINGLETON模式是在SINGLETON的基础上进行了扩展。更多SINGLETON模式的资料请参阅 《设计模式84页》<o:p></o:p>
目的
保证一个类仅有一个实例,并提供一个访问它的全局访问点,一个相对简单的应用型设计模式
动机
此模式最重要的是保证大量类正确的访问单个实例。尽管一台个系统可能有多台打印机,但系统只允许有且只有一个打印缓存。同样比如:一个系统只有一个文件系统、一个窗体管理系统。对于Delphi的VCL来说:大家天天接触的Tapplication,Tscreen,Tclipboard都是。此模式更好的是使你可以在任何时候为你的应用程序提供一个全局对象。其它的用途:可以、提供一些全局的异常句柄,安全控制,为跨进程提供单一的访问点。
怎样保持一个类只有一个实例并且建立好的访问性能?一个全局变量保证了实例的可访问性,但还没有保证多个实例的同时存大的可能。
一个好的解决方案:建立类自身来负责保持自身一个实例的机制。类的第一个实例能保存不会再有类的实例被创建(在创建类的新实例时请求被中段)。并提供一个访问类的方法。这就是我们的singleton模式,典型的应用是建立服务型的的类。
<o:p></o:p>
应用
假设有一个用于显示时间进度低级服务类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;
<o:p></o:p>
下面的代码是应用了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;
<o:p></o:p>
类接口部份的介绍:
· 方法class function Instance用于访问类的单件的实例。此方法一般在第一时间访问,类的实例被创建。
· 类构造器被重载,如果你尝试着不通过instance方法来构建一个新的实例将会抛出一个异常。
· 可通过调用ReleaseInstance来清除单件类存在的实例。一般在你要清除部件时调节器用些方法。在Delphi 1 exit过程中调用,在Delphi 2/3/4/5/6中在单元finalization中调用。不要访问TProgressor.Instance.Free来清除实例,
<o:p></o:p>
现在让我们来看看singleton模式实现。
constructor TProgressor.Create;
begin
inherited Create;
raise Exception.CreateFmt('Access class %s through Instance only',
[ClassName]);
end;
<o:p></o:p>
constructor TProgressor.CreateInstance;
begin
inherited Create;
end;
<o:p></o:p>
destructor TProgressor.Destroy;
begin
if AccessInstance(0) = Self then AccessInstance(2);
inherited Destroy;
end;
<o:p></o:p>
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;
<o:p></o:p>
class function TProgressor.Instance: TProgressor;
begin
Result := AccessInstance(1);
end;
<o:p></o:p>
class procedure TProgressor.ReleaseInstance;
begin
AccessInstance(0).Free;
end;
<o:p></o:p>
procedure TProgressor.SetProgress(Value: Integer);
begin
»加入实现代码
end;
<o:p></o:p>
procedure TProgressor.StartProgress;
begin
»加入实现代码
end;
<o:p></o:p>
此模式的密秘在AccessInstance方法,AccessInstance方法使用了常量来存放实例。<o:p></o:p>
由于Delphi不支持静态类字段的原因,你必需使用此方法。AccessInstance根据请求的参数来确认不同的返回方式,返回当前实例(Request = 0),创建一个实例(Request = 1),重置实例(Request = 2)。Delphi 2/3/4/5/6中,你必须将编译器设置$J+来支持形式常量(参见Delphi在线帮助)
将CreateInstance设成保护方法(protected),我们确保了其它类不能调用类的构造器。但由于构造函数本身为虚函数的原因,它可以被后代重载。例中,当第一次调用类实例时将确认类的具体类型。
唯一需要你手动添加的代码是:在单元的initialization或finalization加入清除代码。
下面是应用实例(Delphi1.0)
<o:p></o:p>
unit ProgressorTest;
<o:p></o:p>
...
...
<o:p></o:p>
implementation
<o:p></o:p>
...
...
<o:p></o:p>
procedure ShutDown; far;
begin
» TProgressor.ReleaseInstance;
end;
<o:p></o:p>
initialization
MMWIN:START INITIALIZATION
» AddExitProc(ShutDown);
end.
<o:p></o:p>
具体操作Tprogressor的代码:
<o:p></o:p>
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;
分享到:
相关推荐
在Qml中,我们可以通过Qt的Singleton组件来实现这一模式。 首先,让我们理解单例模式的基本概念。在软件工程中,单例模式保证一个类只有一个实例,并提供一个全局访问点。这个设计模式在许多场景下都很实用,比如...
这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...
### C++中实现Singleton模式的关键知识点 #### 一、Singleton模式简介 Singleton模式是一种常用的软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中经常被用于控制对共享资源...
**C++实现的Singleton模式详解** Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源,如数据库连接池,或者确保某个...
**Singleton设计模式** Singleton设计模式是软件工程中最常用的设计模式之一,它的主要目的是确保一个类只有一个实例,并提供全局访问点。在Java中,Singleton模式的实现有多种方式,每种方式都有其优缺点,我们将...
Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()...
文件“110425-iceSingeTom”可能是某个关于冰冻单例(Frozen Singleton)或者基于C++标准库`std::call_once`实现的线程安全单例的示例,这种实现方式可以避免在多线程环境中多次实例化。冰冻单例是一种特殊的单例,...
### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...
### Singleton Pattern 单例模式应用详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的...
以下是对"单例实现源码singleton-C++"的详细解析。 1. **静态成员变量法** 这是最常见的单例实现方式。在类中定义一个静态成员变量,该变量保存唯一的实例。例如: ```cpp class Singleton { public: static ...
Singleton模式是设计模式中的一种创建型模式,它在软件工程中扮演着重要的角色。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。Singleton模式的应用场景通常涉及到系统...
在Laravel框架中,设计模式的应用是提升代码质量和可维护性的重要手段之一,而Singleton(单例模式)是其中一种常见的模式。Singleton确保一个类只有一个实例,并提供一个全局访问点,这样可以避免创建多个对象导致...
在Android开发中,单例模式(Singleton)是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在管理共享资源、控制并发以及减少对象创建的开销等方面非常有用。本篇文章将深入讲解...
单例模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制资源的唯一性、全局配置对象或者缓存服务等。本篇文章将深入探讨...
1、没有构造函数(DEFINE_SINGLETON_DEFAULT); 2、有构造函数,构造函数没有参数(DEFINE_SINGLETON_CONSTRUCT_NO_PARAM); 3、有构造函数,构造函数有没有参数版本(DEFINE_SINGLETON_CONSTRUCT_WITH_DEFAULT)...
Singleton* Singleton::instance = nullptr; ``` 3. 提供一个公共的获取实例的方法:这个方法通常称为`getInstance()`,它检查静态指针是否为空,如果为空则创建实例,否则返回已存在的实例。 ```cpp class ...
简单的单例模式举例Singleton 分为恶汉式 懒汉式
单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...