imho.ws |
![]() |
![]() |
![]() |
# 1 |
Junior Member
Регистрация: 19.05.2003
Адрес: Самара
Сообщения: 52
![]() |
Singleton в Delphi, как сделать подобие?
Как лушче всего реализовать подобие Singleton'а (С++) в делфи?
Или как вообще поступают в делфи, когда надо гарантировать один экземпляр класса на приложение? Я вижу только один способ, передавать параметром по иерархии классов. Т.е. один раз создается, а потом передается классам верхнего уровня, а те, в свою очередь, передают его ниже в процедурах установки свойств. Но способ мне не нравится, надо следить за всеми этими присвоениями. Вобщем, как првильно сделать в Delphi 7 (если версия имеет значение).
__________________
Когда у оппонента кончаются аргументы, он начинает уточнять национальность. |
![]() |
![]() |
# 2 |
Junior Member
Регистрация: 28.10.2003
Адрес: Украина
Сообщения: 57
![]() ![]() |
достаточно просто.
Пути я вижу 3, выбери тот который тебе больше всего нравится: 1. в том модуле, где обьявлен твой класс сделай в интерфейсной части глобальную переменную типа твоего класса. В initialize модуля создай экземпляр класса, и присвой ей 2. в том модуле, где обьявлен твой класс сделай глобальную переменную типа твоего класса но в секции implementation. В initialize модуля создай экземпляр класса, и присвой ей. В классе сделай класс функцию (статические в С++) и пусть она возвращает нашу переменную. 3. в том модуле, где обьявлен твой класс в секции implementation сделай глобальную переменную типа твоего класса. В классе сделай класс функцию типа такого: if YourVar = nil then YourVar:=YourClass.Create; result:=YourVar; возможны еще вариации, но ИМХО выходит самый настоящий сингилитон |
![]() |
![]() |
# 3 |
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Код:
{$J+} unit Singleton; interface uses Classes, SysUtils, Forms, Controls, Windows; type TSingleton = class(TControl) private // protected // constructor CreateInstance; class function AccessInstance(Request: Integer): TSingleton; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; class function Instance: TSingleton; class procedure ReleaseInstance; end; implementation class function TSingleton.AccessInstance(Request: Integer): TSingleton; const FInstance: TSingleton = 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; constructor TSingleton.Create; begin // нельзя его вызывать! raise Exception.CreateFmt('Access class %s through Instance only', [ClassName]); end; constructor TSingleton.CreateInstance; begin inherited Create(nil); // делаем то, что нужно end; destructor TSingleton.Destroy; begin // прибираемся за собой inherited; end; class function TSingleton.Instance: TSingleton; begin Result := AccessInstance(1); end; class procedure TSingleton.ReleaseInstance; begin AccessInstance(0).Free; end; end. ![]() соответственно потом обращаться TSingleton.instance....
__________________
Nunc est bibendum |
![]() |