За последние 24 часа нас посетили 58648 программистов и 1816 роботов. Сейчас ищут 837 программистов ...

Паттерны проектирования Singleton

Тема в разделе "Прочие вопросы по PHP", создана пользователем ARACOOL, 25 сен 2010.

  1. ARACOOL

    ARACOOL Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    52
    Симпатии:
    0
    Адрес:
    Самарканд
    Назначение.
    Обеспечивает наличие у класса одного только экземпляра-объекта на всю систему и предоставляет к нему глобальный доступ.

    Ни как не могу понять, единственный экземпляр объекта! Ведь любой класс может быть единственным экземпляром объекта. Создать объект и используешь его во всем движке.
    В чем же заключается отличие? Поправьте если я не правильно понял.

    Заранее благодарен!
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    для начала учи матчасть - класс это класс, объект - это объект, каждый объект принадлежит к какому-то классу.
    Ну типа как негр - экземпляр класса негров.
    Обычно можно создать сколько угодно экземпляров класса:
    PHP:
    1. <?php
    2. $a = new a;
    3. $a1 = new a;
    4. $a2 = new a;
    Паттерн singleton позволяет иметь только один экземпляр класса
    PHP:
    1. <?php
    2. $a = a::getInstance();
    3. $a1 = a::getInstance();
    4. $a2 = a::getInstance();
    тут переменные содержат ссылки на один и тот же экземпяр, созданый внутри статики класса a.
     
  3. ARACOOL

    ARACOOL Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    52
    Симпатии:
    0
    Адрес:
    Самарканд
    Ну Можно создать один объект класса и все
    PHP:
    1. $a = new class;
    и все. И использовать этот $a по всюду!
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    ARACOOL
    Фишка в статичном доступе и обработке ошибок. К тому же это не мешает кому-то ещё сделать $b = new class; и вот второй объект.

    А так a::getInstance() и всё.

    Ну а так же есть и другие полезности :)
     
  5. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    самая фишка (мне нравится и заметил psih), что если где-то в других классах и фунцкциях ты хочешь использовать объект, то естественно к нему надо как-то добраться. Через параметр ли, через глобал или еще как.
    А синглтон, он как класс-объект. Доступ к нему как классу, а обращение как к экземпляру класса.
    Очень некрасивый пример сейчас будет, но тем не менее, чтобы продемонстрировать.
    Допустим, тебе надо нарисовать сайт. Ты придумываешь, что, вот у меня будет класс page - дефолтовая страничка со всем основными настройками и методом вывода контента. И все реальные странички будут ее наследовать и добавлять какие-то свойства и методы.
    Кроме того, ты используешь шаблонизатор, допустим смарти. Для того чтобы объект смарти был всегда под рукой (в каждом классе представляющем страницу) тебе его надо (как уже было ранее сказано) передать. В виде ли свойства класса page толи еще как-то. Так вот, если использовать синглтон, то от этой проблемы ты избавляешься. В любом месте кода, где бы не захотел, оращаешься к нему tplproc::getInstance()->assign(..) и ты уверен, что этот тот самый единственный экземпляр.
    Вот. попытался на пальцах)
     
  6. ARACOOL

    ARACOOL Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    52
    Симпатии:
    0
    Адрес:
    Самарканд
    Psih
    К примеру, какие полезности?
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    ARACOOL
    Зависит от архитектуры. У меня например полезность в том, что все классы имеют деструкторы и уничтожение объектов происходит в правильном порядке благодоря ядру-синглетону, которое занимается загрузкой всех классов в системе (что автоматом делает их по сути синглетонами тоже, т.к. ядро видит что такой объект уже создан и возвращает его).

    Ну и ShamahN правильно описал. Я тоже таким же подходом пользуюсь, только у меня всегда идёт $object = Core::getInstance('className');
     
  8. ARACOOL

    ARACOOL Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    52
    Симпатии:
    0
    Адрес:
    Самарканд
    А какими еще паттернами проектирования вы часто пользуйтесь?
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Адаптер, фабрика, чайнинг
     
  10. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Шаблонный метод
     
  11. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Эта называется вроде как называется абстрактная фабрика. Причем, используемая как статика. По хорошему ее нужно вызывать через синглтон, т.е. так
    Core::getInstance()->getClassName()
     
  12. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    всякими но в основном
    command strategy factory method monostate mapper collection active record да короче когда как ;)
     
  13. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    ИМХО я считаю, что надо изначально понимать, что класс это всего лишь описание - набор инструкций, а объект это набор данных в памяти, тогда всё становится на свои места, а потом уже начинаются особенности ЯП...
     
  14. ARACOOL

    ARACOOL Активный пользователь

    С нами с:
    10 ноя 2006
    Сообщения:
    52
    Симпатии:
    0
    Адрес:
    Самарканд
    Всем большое спасибо за объяснения! Потихоньку начинаю осваивать шаблоны Адаптер + Singleton