3 серпня 2010 р.

"Паттерн вторника!" #1

Всем привет,

Как Вы все, я надеюсь:), заметили, Мы хотим сделать не только встречи нашей группы интересными, но и Наш блог! Потому Мы всячески придумываем новые рубрики чтобы Вам было интересно читать, обсуждать, получать новые знания!

Из своей практики общения с новичками, а иногда уже и старшими программистами, заметил, что многие не любят / не знают / не интересуются паттернами, потому во-вторник мы решили добавить ещё 1 рубркику : "Паттерн вторника". Каждый вторник в этой рубрики будет обсуждаться один паттерн.

Итак, что ж такое паттерн, чтобы не писать объяснения просто заглянем в вики:
Паттерн (англ. pattern — образец, пример, принцип) — заимствованное слово. Слово «pattern» используется как термин в нескольких западных дисциплинах и технологиях, откуда оно и проникло в русскоязычную среду. Смысл термина «паттерн» всегда у́же чем просто «образец», и варьируется в зависимости от области знаний, в которой используется.

Паттерн (информатика) — эффективный способ решения характерных задач проектирования, в частности проектирования компьютерных программ.



Паттерны бывают трех типов:
Порождающие шаблоны(Creational patterns)
Структурные шаблоны(Structural Patterns)
Поведенческие шаблоны(Behavioral Patterns).

Так как рубрика вводная, сегодня мы поговорим про самый простой паттерн : порождающий паттерн Синглтон (Singleton ).

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

Собственно UML диаграмма простейшей реализации синглтона:


На самом деле всевозможных реализаций этого паттерна существует огромнейшее количество, линки на которые я приведу позже.

Простейшая реализация этого паттерна выглядит так:
/// 
/// The 'Singleton' class
/// 
class Singleton
{
private static Singleton _instance;

// Constructor is 'protected'
protected Singleton()
{
}

public static Singleton Instance()
{
// Uses lazy initialization.
// Note: this is not thread safe.
if (_instance == null)
{
_instance = new Singleton();
}

return _instance;
}
}


Пример взят из книги "Gangs of Four", да и диграмма тоже:)

Как видно из примера, мы не можем напрямую вызывать конструктор класса, для этого у нас есть статический метод Instance().
В жизни пример использовать не стоит, потому как если у вас есть несколько потоков, которые захотят дернуть ваш синглтон - все рухнет:)

Где можна применять такой объект: логирование, хранение настроек, и т.д и т.п.

Ссылки на разнообразные реализации синглтона:
http://www.dofactory.com/Patterns/PatternSingleton.aspx#csharp
http://www.yoda.arachsys.com/csharp/singleton.html
http://blog.magenic.com/blogs/jamesa/archive/2009/10/01/A-Lazier-Singleton-with-.NET-4.0.aspx

С уважением,
-Дима

4 коментарі:

  1. ідея хороша, а на інші дні теж будуть якісь плани? Пропоную наприклад один день виділити для статей/питань читачів блогу...

    ВідповістиВидалити
  2. Привет:)

    Думаю вопросов пока немного, и их можна задавать в любой теме или в скайп чате.

    Насчет статей - я ж только за, и частенько про это всем говорю:) Так что - если у вас есть желание написать статью сюда - это только приветствуется!

    ВідповістиВидалити
  3. Завдяки вінницькій дотнет групі наткнувся на цікаві книги
    http://msug.vn.ua/blogs/romank/archive/2010/08/04/head-first.aspx
    Рекомендую переглянути книгу по патернах :)

    ВідповістиВидалити
  4. До речі, ще про потоки і Сінглтон. Знайомого на співбесіді питали як код з прикладу може створити 2 інстанси класу. Така ситуація можлива коли сінглтон ще не створений і декілька конкуруючих потоків доступаються до нього. Тоді поки перший потік створює об'єкт, другий встигає пройти перевірку на null і почати створювати другий інстанс.
    Щоб це обійти потрібно просто залокати перевірку і створення інстансу класу Сінглтону.

    ВідповістиВидалити