文章已经停更许久了,感觉有点儿对不起粉丝朋友。但这也没办法,工作的事情已经让我焦头烂额一地鸡毛了。但是技术总是要学习和沉淀的,所以开启一个新的系列,设计模式
可能Delphi王朝真的没落了,在网上查了很久都是一些重复、陈旧、残缺不全的帖子,搞的像古代的武功秘籍一样,每次只能获取上篇或者下篇,而这些上下还有可能是残篇
正文设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
引自菜鸟教程
从上面的话中不难看出,所谓的设计模式是针对一些常见问题总结出来的一套比较优质的解决方案,所以这个不限语言,所有语言通用。
单例(Singleton)模式:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
其特点如下:
- 单例类只有一个实例对象
- 该单例对象必须由单例类自行创建
- 单例类对外提供一个访问该单例的全局访问点
有人说单例是所有设计模式中最简单的,其实我并不认同,单例模式就我知道的Java中的写法就有7、8种之多(当然每一种写法是有其使用意义的,否则就变成茴字有几种写法了)
Delphi的设计模式部分我还在摸索学习,同时为了方便学习,案例还是以控制台应用的形式呈现,尽量减少库和单元的引用
代码实现本文代码在DelphiXE10.4版本下测试通过
unit uCommonUtil;
interface
uses
System.SysUtils;
type
{ TSingle }
TSingle = class(TObject)
private
FNum: string;
protected
public
constructor Create;
class function GetInstance(): TSingle;
class function NewInstance: TObject; override;
procedure FreeInstance; override;
property Str: string read FNum write FNum;
published
end;
implementation
var
GlobalSingle: TSingle;
{ TSingle }
constructor TSingle.Create;
begin
Str := '单例模式测试';
end;
procedure TSingle.FreeInstance;
begin
inherited;
GlobalSingle := nil;
end;
class function TSingle.GetInstance: TSingle;
begin
//判断当前全局变量GlobalSingle不空则创建对象,这里在并发环境下存在安全隐患
if GlobalSingle = nil then begin
GlobalSingle := TSingle.create();
end;
Result := GlobalSingle;
end;
class function TSingle.NewInstance: TObject;
begin
if GlobalSingle = nil then
//重载方法通过父类 NewInstance方法获取对象,强制转换为 TSingle类型
GlobalSingle := TSingle(inherited NewInstance);
Result := GlobalSingle;
end;
end.
下面是测试代码
program ProjectSingle;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Types,
uCommonUtil in 'uCommonUtil.pas';
var
P1, P2: Pointer;
begin
try
var com1 := TSingle.GetInstance();
p1 := com1;
P2 := TSingle.GetInstance();
//通过输出的地址可见是同一个对象
writeln(IntToStr(Integer(p2)));
writeln(IntToStr(Integer(p1)));
except
on e: Exception do
writeln(e.Message);
end;
readln;
end.
结语
关于文章的代码我是统一放在Github仓库中的。地址:https://github.com/coder163/DesignPatternForDelphi
如果有需要请自取,当然如果方便的话,希望能留下一个星星[玫瑰]