imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 03.02.2005, 13:40     # 1
Felan
Junior Member
 
Аватар для Felan
 
Регистрация: 19.05.2003
Адрес: Самара
Сообщения: 52

Felan Путь к славе только начался
Singleton в Delphi, как сделать подобие?

Как лушче всего реализовать подобие Singleton'а (С++) в делфи?
Или как вообще поступают в делфи, когда надо гарантировать один экземпляр класса на приложение?
Я вижу только один способ, передавать параметром по иерархии классов. Т.е. один раз создается, а потом передается классам верхнего уровня, а те, в свою очередь, передают его ниже в процедурах установки свойств.
Но способ мне не нравится, надо следить за всеми этими присвоениями. Вобщем, как првильно сделать в Delphi 7 (если версия имеет значение).
__________________
Когда у оппонента кончаются аргументы, он начинает уточнять национальность.
Felan вне форума  
Старый 09.02.2005, 11:26     # 2
PVitaliy
Junior Member
 
Регистрация: 28.10.2003
Адрес: Украина
Сообщения: 57

PVitaliy Нимб уже пробиваетсяPVitaliy Нимб уже пробивается
достаточно просто.
Пути я вижу 3, выбери тот который тебе больше всего нравится:

1. в том модуле, где обьявлен твой класс сделай в интерфейсной части глобальную переменную типа твоего класса. В initialize модуля создай экземпляр класса, и присвой ей

2. в том модуле, где обьявлен твой класс сделай глобальную переменную типа твоего класса но в секции implementation. В initialize модуля создай экземпляр класса, и присвой ей. В классе сделай класс функцию (статические в С++) и пусть она возвращает нашу переменную.

3. в том модуле, где обьявлен твой класс в секции implementation сделай глобальную переменную типа твоего класса. В классе сделай класс функцию типа такого:
if YourVar = nil then YourVar:=YourClass.Create;
result:=YourVar;

возможны еще вариации, но ИМХО выходит самый настоящий сингилитон
PVitaliy вне форума  
Старый 09.02.2005, 12:13     # 3
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
Код:
{$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
is_absent вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 13:28.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.