powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как переделать на синглтон
28 сообщений из 28, показаны все 2 страниц
как переделать на синглтон
    #39578746
СинийТон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть библиотечка, а в ней классик.
Как его переделать на синглтон, чтобы не менять код в других модулях?
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578750
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТонЕсть библиотечка, а в ней классик.
Как его переделать на синглтон
function -> class function
procedure -> class procedure
var -> class var

, чтобы не менять код в других модулях?Никак. Код менять придется.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578752
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте внятно объяснить, что у Вас есть, почему Вас это не устраивает и, что Вы хотите изменить?
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578754
СинийТон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, так можно, да, но люди привыкли к Сreate-Free.

Ещё есть доп-условия:
- не менять ранее написанный код использования,
- не создавать раньше первого реального Сreate,
- Сreate может быть из нескольких потоков,
- если можно, то сделать реальный Free, если сейчас этот объект не нужен (хотелка)

по-факту даже не синглтон получается, а как-то так ...

Что-то туплю, чую простое решение, но туплю.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578756
СинийТон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, внятно объяснить это наверное завтра, может отосплюсь, а то тяжело синапсам так сразу в бой )
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578762
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТонrgreat, так можно, да, но люди привыкли к Сreate-Free.
Вы так говорите как будто это что-то хорошее.

Ещё есть доп-условия:
- не менять ранее написанный код использования,
В чем тогда смысл синглтона, и что вы вообще подразумеваете под этим термином?

- не создавать раньше первого реального Сreate,
Разве бывают некие-то "не реальные" Create?

- Сreate может быть из нескольких потоков,
Ок, но при чем тут синглтон?

- если можно, то сделать реальный Free, если сейчас этот объект не нужен (хотелка)
по-факту даже не синглтон получается, а как-то так ...
Может вам не синглтон а контейнер нужен?

Что-то туплю, чую простое решение, но туплю.Как-то да. TList<T> или TDictionary<T> маячат на горизонте.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578763
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТонЕщё есть доп-условия:
- не менять ранее написанный код использования,
- не создавать раньше первого реального Сreate,
- если можно, то сделать реальный Free, если сейчас этот объект не нужен (хотелка)
1. Исходный класс переименовываем и прячем в Implementation
2. Объявляем интерфейс с тем же именем и методами, что раньше были у класса
3. Объявляем, что наш класс реализует этот интерфейс
4. Объявляем у интерфейса метод Free и делаем пустым его реализацию
5. Объявляем функцию CreateMyObject в таком духе
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
  GSingleton: IMyIntf;

function CreateMyObject: IMyIntf;
begin
  if GSingleton = nil then begin
    GSingleton := TMyObj.Create;
    Result := GSingleton;
    GSingleton._Release;  // Освобождаем счетчик ссылок
  end else
    Result := GSingleton;
end;


6. В деструкторе не забываем обнулить ссылку
Код: pascal
1.
2.
3.
4.
5.
destructor TMyObj.Destroy;
begin
  Pointer(GSingleton) = nil;
  inherited Destroy;
end;


СинийТон- Сreate может быть из нескольких потоков,Не забываем про синхронизацию доступа как к самому GSingleton, так и к его полям

Таким образом, все задачи, кроме
СинийТонно люди привыкли к Сreateрешены. Вместо Сreate придется таки писать CreateMyObject
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578769
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы все удовлетворяло вашим условиям и нигде не менять код Используйте паттерн адаптер
Вы сможете повторить все методы вашего класса + добавить новые (Free когда объект реально (по мнению разработчика, а не системы) не нужен). Внутри адаптера реализуйте ваш класс в виде синглтона.
Платой за это будет дублирование всех public методов и свойств
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578869
СинийТон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за замечания-предложения!

- Сreate может быть из нескольких потоков,Ок, но при чем тут синглтон?- Думаю что в момент создания первого-единого экземпляра из одного потока, нужно как-то будет подождать второму-третьему потоку завершения создания объекта в первом? Не знаю какую тут проще-нужно конструкцию синхронизации использовать?


- Да, адаптер , как-бы оно, но его и хочется сделать синглтоном (не создавать на каждый Create).


- А если по аналогии с 4. Объявляем у интерфейса метод Free и делаем пустым его реализациюподменить конструктор на:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TTest = class
  class function Create:TTest;
end;

class function TTest.Create: TTest;
begin
 // inc(fRef);
 // if single then
 Result := inherited Create;
end;

Так сработает или это совсем грязно?
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578912
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно, как в соседней ветке, для начала разобраться с тз: нужен один инстанс класса (синглтон) или много инстансов? потом думать как тз реализовать.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39578975
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТонДа, адаптер , как-бы оно, но его и хочется сделать синглтономЗачем? В адаптере нет никаких полей. Зачем он синглтоном
СинийТонТак сработает или это совсем грязно?Для конструктора сработает. Для Free как метода класса - нет
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579253
СинийТон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon, да, тз:

Реализовать класс который
- поддерживает многопоточное использование;
- создаст только один инстанс на время использования;
- когда все ссылки на инстанс будут освобождены, освободит и этот {один} инстанс;
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579256
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТон,

судя по тз, единственный инстанс во время работы должен постоянно создаваться и разрушаться?
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579323
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТонmakhaon, да, тз:

Реализовать класс который
- поддерживает многопоточное использование;
- создаст только один инстанс на время использования;
- когда все ссылки на инстанс будут освобождены, освободит и этот {один} инстанс;

У вас во время создания инстанса происходит долгая инициализация? Или класс должен быть statefull между разными потоками? Или по коду должен быть один экземпляр общий для всех? (Например настройки приложения)
Какой смысл перевода на синглтон? Просто работа ради работы или есть действительное обоснование?
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579366
СинийТон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonединственный инстанс во время работы должен постоянно создаваться и разрушаться?да, но там всплески активности раз в час или несколько часов, а использующие на самом деле не сразу зовут фри, а с некоторой задержкой.

У вас во время создания инстанса происходит долгая инициализация?
Или класс должен быть statefull между разными потоками?
Или по коду должен быть один экземпляр общий для всех? (Например настройки приложения)- Иногда, - да, - да
Какой смысл перевода на синглтон? Просто работа ради работы или есть действительное обоснование? Первоначально не думалось про многопоточное использование (и такой псевдо синглтон получался сам собой). Теперь ещё и оптимизации какой-то захотелось и разобраться для себя интересно.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579547
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТонrgreat, так можно, да, но люди привыкли к Сreate-Free.Откуда только такие дегенераты берутся, гнать таких надо. "Программист" и "привык" это всё - крах карьеры.

модуль по сути и есть синглтон, не надо всякую фигню изобретать без острой необходимости.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579589
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТон,

костылевато, конечно, довольно сильно. ну да ладно.

Create/Free переопределить, вести в них счетчик (если многопоточка - то через InterlockedIncrement/TInterlocked.Increment). Счетчик и сам инстанс сделать классовыми переменными. В Create если счетчик = 0, создаём единственный внутренний инстанс, иначе ничего не деаем. Во Free пока счетчик больше 0, ничего не делаем. Когда становится равным нулю, разрушаем единственный инстанс. Все методы и свойства делаем через классовый методы к внутреннему реальному инстансу.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579660
СинийТон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon, оно то всё так, но с многопоточкой есть нюансы.

Когда одновременно два потока зайдут в Create кто-то из них должен будет создать инстанс, а кто-то подождать результата его работы.

И при обычных условия внутри Create у нас уже есть новый инстанс, нужно, как я понимаю, переопределить NewInstance.
Буду смотреть в отладчике как там и что, раньше с таким не сталкивался. Если у кого есть примерчик с краткими пояснениями, то не откажусь.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579674
СинийТон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan), ?

Есть мой функционал в dll. Для удобства его использования сделал обёртку.

Ребята используют как-то так:
Код: pascal
1.
2.
3.
4.
5.
6.
w :=TWrapper.Create;
try
  w.Run();
finally
  w.Free;
end;

Хочу-нужно изменить внутреннюю реализацию, по возможности, не напрягая коллег.

Что в этом неэстетического, что Вас огорчило?
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579688
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТон,

Так пусть w :=TWrapper.Create; создается хоть 100500 экземпляров... Он как адаптер обернет ваш скрытый синглтон, который будет в единственном экземпляре.
Не надо городить переопределения NewInstance FreeInstance.
Сделали Адаптер и забыли... Единственное что при появлении метода в вашем классе, его надо пробросить и в адаптер. Но это решается комментариями к классу
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579715
СинийТон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-CiteТак пусть w :=TWrapper.Create; создается хоть 100500 экземпляров...да, новогодний перфекционизм рассеялся - скрипач синглтон не нужен )).
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579854
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКогда одновременно два потока зайдут в Create кто-то из них должен будет создать инстанс, а кто-то подождать результата его работы.

Один поток создаст инстанс потому, что счётчик будет = 0. Второй поток должен, как я понимаю, InterlockedIncrement'ом придержаться. И ему уже вернётся счетчик = 1. Отдельную проверку счетчику не делать, проверять результат InterlockedIncrement'а.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579856
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если совсем не получится - то по-старинке, критической секцией, одной на конструктор и деструктор. Тогда и счетчик можно не лочить.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579864
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
также можно посмотреть в сторону InterlockedCompareExchange и InterlockedAdd.
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39579887
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СинийТонkealon(Ruslan), ?

Есть мой функционал в dll. Для удобства его использования сделал обёртку.

Ребята используют как-то так:
Код: pascal
1.
2.
3.
4.
5.
6.
w :=TWrapper.Create;
try
  w.Run();
finally
  w.Free;
end;

Хочу-нужно изменить внутреннюю реализацию, по возможности, не напрягая коллег.

Что в этом неэстетического, что Вас огорчило?меня это нисколько не огорчает, пока будут такие деятели у меня будет работа и зп

чем
Код: pascal
1.
???_Run();

сложнее для понимания?
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39580896
figli
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СинийТон,
объяви например, функцию и выставь только ее наружу с тем же именем что бывший "синглетон"

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
interface

type
  TTest = class
  end;

function Test: TTest;

implementation

function Test: TTest;
const
  FTest: TTest = nil;
begin
  if not Assigned(FTest) then
    FTest := TTest.Create;
  Result := FTest;
end;
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39580906
figli
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
figli,

локальную освободи гденибудь в финализэйшн, но от креате-фри по всему проекту придется отказаться, только обращения оставить
...
Рейтинг: 0 / 0
как переделать на синглтон
    #39581126
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
figli,

если бы от креат - фри отказаться то всё просто ) но вот хочется человеку поизголяться. да еще и в много-поточном режиме. опять же, почему инстанс класса просто в начале работы не создать. а в конце не разрушить - отдельная загадка. зачем счётчики, разрушения, создания? загадочное всё какое-то.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / как переделать на синглтон
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]