За последние 24 часа нас посетили 22158 программистов и 1059 роботов. Сейчас ищут 626 программистов ...

Статический синглтон

Тема в разделе "Решения, алгоритмы", создана пользователем [vs], 7 ноя 2009.

  1. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Обычный синглтон имеет один статический метод:
    Код (PHP):
    1. <?php
    2. class Singleton
    3. {
    4.         static $instance;
    5.         
    6.         public static function getInstance()
    7.         {
    8.                 if (empty(self::$instance))
    9.                 {
    10.                         self::$instance = new self;
    11.                 }
    12.                 return self::$instance;
    13.         }
    14.         
    15.         private __construct()
    16.         {
    17.                 /* конструктор пустой крайне редко */
    18.         }
    19.  
    20.         private __clone() {}
    21.         
    22.         public function fn($var)
    23.         {
    24.                 /* do */
    25.         }
    26. }
    27. ?>
    Часто используется вместо статики лишь для того, чтобы инициировать какое-то состояние при создании объекта.
    Его можно модифицировать, чтобы использовать статику и не плодить переменные:
    Код (PHP):
    1. <?php
    2. class Singleton
    3. {
    4.         // Singletone
    5.         static $instance;
    6.  
    7.         private static function getInstance()
    8.         {
    9.                 if (empty(self::$instance))
    10.                 {
    11.                         self::$instance = new self;
    12.                 }
    13.                 return self::$instance;
    14.         }
    15.  
    16.         private function __construct()
    17.         {
    18.                 $this -> msg = 'Preved!';
    19.         }
    20.  
    21.         private function __clone() {}
    22.         
    23.         // Static methods
    24.         public static function getMsg()
    25.         {
    26.                 return self::getInstance() -> msg;
    27.         }
    28. }
    29. ?>
    Наглухо заперев сам объект, можно использовать статику, при этом инициировать какое-то состояние при первом использовании.
    Как идея?
     
  2. kostyl

    kostyl Guest

    эм... адаптер?
     
  3. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    kostyl
    ))))))))))))))))
    не знал.
     
  4. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Доступ к приватным методам и свойствам закрываешь.
     
  5. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Sergey89
    Я забыл getInstance сделать приватным методом. По-идее, должны все закрываться. Только статические открытые.
     
  6. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Тогда это будет банально статический класс.
    А то что внутри заперт какой-то объект, который и нафиг там нужен непонятно, это уже деталь реализации.
     
  7. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Неа. Это статический класс с конструктором!
     
  8. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    В чём его смысл?
    В предварительной инициализации?
    Её можно вынести в статический метод init() и в каждом методе вызывать его вместо getInstance()
     
  9. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    А еще можно использовать __set, __get, тоже через статические функции. Это конечно можно реализовать в статике, но зачем, если все уже реализовано? А еще можно делать сериализацию.
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а в чём прикол топика? ничё такого
     
  11. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Mr.M.I.T.
    Угу, оказывается такой паттерн уже существует - адаптер.
     
  12. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Как я понял из первого поста смысл сего — использовать статический класс вместо объектов, но при этом иметь что-то вроде конструктора для начальной инициализации.

    Если так, то вышеприведённое решение хоть как-то и напоминает адаптер по своей реализации, не имеет к нему никакого отношения по типу решаемой задачи.

    И зачем в таком случае нужен внутренний объект так же не ясно.
     
  13. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    так скажем, это больше чего то похоже на адаптер... Скорее всего
    этим это и было показано.
     
  14. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    vasa_c
    Объект персонажа в игре харнится в сериализованом виде. Вот такой штукой удобно его десереализовать и сразу использовать + не создавать лишние переменные в разных методах и функциях, т.к. статика доступна везде.
     
  15. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    например, для соединения с базой данных в бааальшом приложении)