Должны ли конструкторы подклассов быть приватными при реализации синглтона?

Доброго времени!

Есть классический singleton-класс. От него наследуются другие классы. Вопрос: должны ли эти классы точно так же реализовывать логику паттерна (т.е. через getInstance), или их-то как раз можно создавать классическим образом через new? Есть ли какие-либо рекомендации на этот счет, или паттерн можно применять по необходимости даже в подклассах?

Как вариант, корректен ли и хорош ли с точки зрения чистоты и красоты программирования создать в родительском классе переменные по типу инстанса:
public static $_controller;
...и после, создавать их в наследуемом классе:
parent::$_controller = new self;
Чтобы таким образом иметь экземпляры подклассов, сконцентрированных в едином главном классе?

Буду благодарен за советы и рекомендации, спасибо.
  • Вопрос задан
  • 2488 просмотров
Решения вопроса 1
Heian
@Heian Автор вопроса
Ашот
Как выяснилось годом позже, речь шла о разновидности Dependency Injection, и по факту к синглтону вопрос не имел отношения.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
Эммм.. Классический синглтон не может быть отнаследован. У него приватный конструктор. Разве нет? habrahabr.ru/post/31375
Ответ написан
@DancingOnWater
Есть классический singleton-класс. От него наследуются другие классы. Вопрос: должны ли эти классы точно так же реализовывать логику паттерна (т.е. через getInstance), или их-то как раз можно создавать классическим образом через new?

Если вы наследуетесь от синглетона, значит вы хотите. чтоб эти классы были тоже синглетонами. Тогда ответ очевиден - да.
Если же вы не хотите, чтоб классы были синглетонами, значит вам не надо наследоваться и тогда ответ -нет.

Как вариант, корректен ли и хорош ли с точки зрения чистоты и красоты программирования создать в родительском классе переменные по типу инстанса:
public static $_controller;
...и после, создавать их в наследуемом классе:
parent::$_controller = new self;
Чтобы таким образом иметь экземпляры подклассов, сконцентрированных в едином главном классе?

Буду благодарен за советы и рекомендации, спасибо.

Похоже вы хотите что-то страшное. Поясняю.
Обычно в ООП программировании программа строится на классах, имеющие несколько экземпляров. Этим достигается инкапсуляция, повторное использование кода и потокобезопасность. Синглетон, с одной стороны, это обычный класс, но имеющий на всю программу один экземпляр.
Чрезмерное их количество легко нарушит инкапсулированность, создаст проблемы в многопоточности и повторном использовании кода, дальше все будет только хуже.
Ответ написан
@asd111
По моему в вашем случае лучше сделать protected static controller чтобы он был недоступен для ненаследников и писать self::controller=new self() тогда ваш родитель будет как интерфейс а наследники будут его реализовывать
Ответ написан
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Кажется я понял что ты имеешь в виду. Сейчас сам как раз копаюсь над этим.
Ты хочешь микро-модули сделать, которые контроллируются из единой оболочки/шины/модуля, так?

В JS это очень четко делалось:
App = {};
Module = {
  b : function() {}
};
App.b = Module.b;
App.b();

И все было шоколадно и легко. Почему собственно и делают приложения на Ноде, ибо удобно и не надо страдать гемороем с ПХП.

В нашем случае эти 4 строчки увеличиваются в код диких размеров. Вкури мой последний вопрос, я как раз сейчас эт сделать пытаюсь. Может чего и выйдет совместными усилиями.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы