“Паттерн вторника!” #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
С уважением,
-Дима
ідея хороша, а на інші дні теж будуть якісь плани? Пропоную наприклад один день виділити для статей/питань читачів блогу…
Привет:)
Думаю вопросов пока немного, и их можна задавать в любой теме или в скайп чате.
Насчет статей – я ж только за, и частенько про это всем говорю:) Так что – если у вас есть желание написать статью сюда – это только приветствуется!
Завдяки вінницькій дотнет групі наткнувся на цікаві книги
http://msug.vn.ua/blogs/romank/archive/2010/08/04/head-first.aspx
Рекомендую переглянути книгу по патернах 🙂
До речі, ще про потоки і Сінглтон. Знайомого на співбесіді питали як код з прикладу може створити 2 інстанси класу. Така ситуація можлива коли сінглтон ще не створений і декілька конкуруючих потоків доступаються до нього. Тоді поки перший потік створює об'єкт, другий встигає пройти перевірку на null і почати створювати другий інстанс.
Щоб це обійти потрібно просто залокати перевірку і створення інстансу класу Сінглтону.