关于单例模式(Java版和Delphi版)(0分)

  • 主题发起人 主题发起人 billy_yuan
  • 开始时间 开始时间
B

billy_yuan

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi 版
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
class function getNew():TObject ;
end;

var
Form1: TForm1;
a:TObject;
implementation
{$R *.DFM}
class function TForm1.getNew: TObject;
begin
if a <> nil then
a := TObject.Create ;
result := a ;
end;

end.
解释:
只有通过类方法的调用实现最终实现返回同一个实例,
TForm1.getNew() ;
如果通过实例的调用的话,那么肯定得到的不是同一个实例
Form1.getNew();这样调用非法!如果把getNew()定义为TFrom1里面的
一个方法的话,那么随着Form1的不同,getNew()返回的实例肯定不同。
------------------------------------------------------------------
Java 版
public class Singleton {
  private static Singleton _instance = new Singleton();

  public static Singleton getInstance() {
    return _instance;
  }
}
在JAVA中则实现更为简单,把_instance定义成为静态变量,然后初始化该静态变量
的实例,然后用静态方法getInstance()调用,这样得到的实例肯定是一样的。
 
个人觉得delphi的实现不是很好
把a定义为全局变量感觉怪怪的
似乎不太符合面向对象的封装思想
a本来应该是类保护的数据
定义为全局变量似乎不太安全吧
 
JAVA好啊!
 
to siyan
a本来应该是类保护的数据
-----------------------
老兄,我也想定义成类保护的数据啊,但是在类方法里面
能够访问到类保护的对象么?不信你用一下SELF关键字,看看能不能编译通过。
 
我现在用的是DELPHI
我也想学JAVA
能不能介绍基本JAVA 的好书或者是好的思想
 
我觉得该示例根本不能完全体现单例模式的思想。
不知楼主是自创的,还是从什么地方COPY过来的?
 
ModelMaker 中支持设计模式,其中就有单例模式的实现,大家可以看一下。
 
ModelMaker的单例模式:
TProgressor = class (TObject)
private:
FProgress: Integer;
protected:
constructor CreateInstance;
class function AccessInstance(Request: Integer): TProgressor;
procedure SetProgress(const Value: Integer);
public:
constructor Create;
destructor Destroy;
override;
class function Instance: TProgressor;
class procedure ReleaseInstance;
&amp;raquo;
procedure StartProgress;
&amp;raquo;
property Progress: Integer read FProgress write SetProgress;
end;
-------------------------------------------------------------------
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(const Value: Integer);
begin
&amp;raquo;
//Place here the implementation of the progress mechanism
end;
procedure TProgressor.StartProgress;
begin
&amp;raquo;
//Place here the implementation of the progress mechanism
end;
 
春三月,和Borland专家--刘艺相约上海!
大家好:
 “一年之计在于春”,春天是定目标、打基础关键时刻!
无论你的目标是加薪,成为项目经理,还是让自己的技术水平更上一层楼,
都需要不断地学习,而与高手的交流,仿佛是站在巨人的肩上:站得高,看得远,助力你迅速成为Delphi高手!
应中国项目经理网邀请,Borland专家--刘艺老师将于这个三月来到上海
给大家做<<UML与DELPHI模型驱动开发>>的培训,机会难得!请热爱Delphi的朋友请抓紧时间报名!
届时将会有众多Delphi高手光临现场!热烈的现场讨论以及众多Delphi高手的面对面交流讲师本次培训的特色之一!
在温暖的三月,刘艺与众多Delphi高手与大家相约上海!

中国项目经理网相关培训链接:
[公告]阳春三月,和刘艺老师面对面讨论UML和Delphi面向对象开发!
http://www.china-pm.net/dispbbs.asp?boardID=22&amp;ID=5&amp;page=1
[公告]uml与delphi模型驱动开发课程介绍
http://www.china-pm.net/dispbbs.asp?boardID=22&amp;ID=21&amp;page=1
报名表
http://www.china-pm.net/dispbbs.asp?boardID=22&amp;ID=35&amp;page=1
中国项目经理网
2004-02-14
 
后退
顶部