델파이에 입문한지 얼마 안된 초짜 프로그래머입니다.
싱글턴을 사용할 일이 있어서 구현해보려고 이래저래 방법을 찾고 있는데
아직까지 방법을 못 찾고 있습니다.
제가 C++/JAVA 혹은 C#에서 구현하고 사용하던 방식으로 싱글턴을 구현했으면 하는데
일단 문제가 생성자로의 접근을 막지 못한다는 것 입니다.
private 으로 생성자(이름은 Create)를 선언했음에도 여전히 Create이 불려지더군요.
TObject의 생성자인 것 같기도 하고...
그래서 다른 방법을 찾아 봤는데 역시나 인스턴스가 중복으로 생성되는군요.
찾아본 몇가지 방법으로는
http://www.delphiunion.com/dwp/etc/singletonclass.html
http://delphi.borlandforum.com/impboard/impboard.dll?action=read&db=del_tutorial&no=69
인데
전자는 생성자 자체를 활용하는 것 같은데 테스트 해 본 결과 되지 않았고
두번째는 GetObject()가 있기는 하지만 Create로의 접근이 막혀 있지 않아 문제가 있다는 것 입니다.
즉 GetObject()를 통하지 않고서도 객체가 생성이 되기 때문에 싱글턴이 아닙니다.
제가 아직 경험과 지식이 짧아 잘 모를수도 있지만 제가 아는 바로는 현재 위와 같은 문제가 있는데
혹시 해결할 수 있는 방법이 없을까요?
델파이는 버전6을 사용하고 있습니다.
* 찾아본 두 번재 방법으로 만들어본 테스트 코드입니다.
// project2
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils,
Unit1 in 'Unit1.pas';
var
s1, s2, s3 : Singleton;
begin
s1 := Singleton.GetInstance();
s2 := Singleton.GetInstance();
s1.msg := 's1';
s2.msg := 's2';
s3 := Singleton.Create();
s3.msg := 's3';
Writeln( s1.msg );
Writeln( s2.msg );
Writeln( s3.msg );
end.
// end project2
// unit1
unit Unit1;
interface
type
Singleton = class
public
msg : String;
class function GetInstance() : Singleton;
end;
implementation
var
instance : Singleton = nil;
class function Singleton.GetInstance() : Singleton;
begin
if instance = nil then
instance := Singleton.Create();
Result := instance;
end;
end.
// end unit1
|