谁能用Delphi7实现单例模式(100)

  • 主题发起人 主题发起人 muhx
  • 开始时间 开始时间
M

muhx

Unregistered / Unconfirmed
GUEST, unregistred user!
单例模式(单件模式、Singleton Pattern)应该是23中设计模式中最简单最容易理解的设计模式作为一种方法学也是语言无关的但是我却不能用Delphi7来实现它谁有好的办法吗?BTW,是Delphi 7,因为我已经用Delphi 2006以上的版本实现了
 
http://delphi.sharpplus.com/Delphi/singleton.htm
 
这个帖子的本意是大家讨论,包括设计模式,VCL等方面,而不是非要找出一种解决方案.同样,对于模式的使用,都有哪些利弊也可以讨论,过度设计也未必可取.楼上的朋友给出的连接,陈省采用了一个巧妙的办法,既然在Delphi 7中Create必须是Public,但是观察到了Create在编译器中必然调用NewInstance这个方法,那么他Override了NewInstance,从底层控制了每次只创建一个实例,即使使用Create,也不会造成创建多个另外使用了全局变量,当然这种破坏OO的方式也是不得以而为之.不过话说回来了,如果使用全局变量,那么还用Singleton Pattern这种略显复杂的方法干嘛呢,岂不是为了模式而模式?大家还有没有别的思路?
 
好像听别人叫你穆老大哦。你的探索精神没先赞一个,我已经落伍了。是不是可以这样:TSingletonTest = classprivate constructor CreateNew;public constructor Create;
class function GetInstance(): TSingletonTest;
procedure Show();
end;
constructor TSingletonTest.Create;
begin
raise Exception.Create('do not use create of '+ClassName);
end;
constructor TSingletonTest.CreateNew;
begin
;
end;
class function TSingletonTest.GetInstance: TSingletonTest;{$J+}const inst: TSingletonTest = nil;{$J-}begin
if not Assigned(inst) then
begin
inst := TSingletonTest.CreateNew;
end;
Result := inst;
end;
procedure TSingletonTest.Show;
begin
ShowMessage('address:'+IntToStr(Integer(self)));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TSingletonTest.GetInstance.Show;
end;
C++的做法类似,不过这里没有考虑线程安全的问题。
 
To abszo,是我的同事在开玩笑,惭愧,一般都叫我小穆我之前研究过你写的中间件,超级强悍非常佩服
 
To abszo老大就是老大,代码非常漂亮CreateNew能否Protected并且声明成虚函数这样这个类就可以复用了。谢谢你顶我的帖子
 
思路是这样,protected与否看个人爱好。那个中间见我已经1年半多没碰了,体力不支啊。我的富翁笔记里头有倒数第二个版本。我最近想用delphi做个像C++的auto_ptr来,估计是白费劲,你有何高见?
 
To abszo技术上我没有建议建议您做个设计和框架,并且分配一些子功能,让有兴趣的朋友能和你一起完成另外对于你的中间件,真的希望能继续下去
 
难得多年没看到有水平的帖子了....
 
好像这个话题引不起大家参与的兴趣?难道分少了?以后不发这么沉重的帖子了可能聊快乐女声也比这个有人气呵呵
 
穆同学果然比较空闲。
 
这个帖子主要作为讨论用Delphi 2006 中已经提供了静态变量 class var ……
 
在D7中 既没有类似java的静态变量 编译器本身又会调整级别所以在D7中实现类似java一样的单例几乎是不可能的(java的单例除非是饿汉式的 其他单例的在多线程上貌似还有些问题)已有的例子无非也就是在 NewInstance和FreeInstance 上面绕圈圈本质上还是在玩全局变量 也就是楼主所说的对OO的破坏abszo使用{$J}来实现单例 并且撇开了全局变量但这样做有个小小问题 在于从代码结构来看的确是不错的单例形式 但这个单例我需要去释放的时候怎么去释放呢?
 
大家还有补充吗?如果没有了就放分走人
 
BTW,是Delphi 7,因为我已经用Delphi 2006以上的版本实现了???TClipbrd对象就是最好的例子,好像哪个版本都有啊。
 
To 楼上的Delphi 2006支持类变量(静态变量)也支持Create为Private所以实现起来比较容易
 
Avalon,Delphi7不像2006,实现起来不是那么完美,如果你像释放,你看看这样如何:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private { Private declarations } public { Public declarations } end;
TSingletonTest = class private constructor CreateNew;
public constructor Create;
class function GetInstance(GetFlag: Boolean = true): TSingletonTest;
procedure Show();
end;
var Form1: TForm1;implementation{$R *.dfm}constructor TSingletonTest.Create;
begin
raise Exception.Create('do not use create of '+ClassName);
end;
constructor TSingletonTest.CreateNew;
begin
;
end;
class function TSingletonTest.GetInstance(GetFlag: Boolean = true): TSingletonTest;{$J+}const inst: TSingletonTest = nil;{$J-}begin
if GetFlag then
begin
if not Assigned(inst) then
begin
inst := TSingletonTest.CreateNew;
end;
end else
begin
if Assigned(inst) then
begin
inst.Free;
inst := nil;
end;
end;
Result := inst;
end;
procedure TSingletonTest.Show;
begin
ShowMessage('address:'+IntToStr(Integer(self)));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TSingletonTest.GetInstance.Show;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TSingletonTest.GetInstance(false);
end;
initialization ;
finalization TSingletonTest.GetInstance(false);
end.
 
我见过override TObject的NewInstance方法实现的.其实不用那么费劲,我一般都是声明一个变量,程序开始时初始化为nil,写个函数返回它,在函数里判断一下需不需要创建就行了,比如:function GetXXX:TXXX;
begin
if FXXX=nil then
FXXX:=TXXX.Create;
Result:=FXXX;
end;
这样写很简单,而且又实现了单例模式的功能.
 
学习。。。学习。。。嘿嘿,努力!!
 
后退
顶部