Code better 2 Паттерны программирования
Что такое паттерны?.. <ul><li>― Устойчивый узнаваемый способ или подход к решению часто встречающихся проблем ООП. </li></...
Рассматриваемые паттерны <ul><li>Фабричный метод ( Factory Method) </li></ul><ul><li>Одиночка ( Singleton) </li></ul><ul><...
Фабричный метод (назначение) <ul><li>Определяет интерфейс для создания объектов, при этом выбранный класс инстанциируется ...
Фабричный метод (схема)
Фабричный метод (пример кода) <ul><li>using System; </li></ul><ul><li>using System.Collections; </li></ul><ul><li>class Fa...
Одиночка (назначение) <ul><li>Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точк...
Одиночка (схема)
Одиночка (пример кода) <ul><li>public class Singleton { </li></ul><ul><li>// Private constructor </li></ul><ul><li>Singlet...
Итератор (назначение) <ul><li>Предоставляет способ последовательного доступа ко всем элементам составного объекта, не раск...
Итератор (схема)
Итератор (пример кода) <ul><li>using System; </li></ul><ul><li>using System.Collections; </li></ul><ul><li>class IteratorP...
Адаптер (назначение) <ul><li>Преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты. </li></ul>
Адаптер (схема)
Адаптер (пример кода) <ul><li>using System; </li></ul><ul><li>// Existing way requests are implemented </li></ul><ul><li>c...
Прототип (назначение) <ul><li>Задает виды создаваемых объектов с помощью экземпляра-прототипа, и создает новые объекты пут...
Прототип (схема)
Прототип (пример кода) <ul><li>using System; </li></ul><ul><li>using System.Collections.Generic; </li></ul><ul><li>using S...
Компоновщик (назначение ) <ul><li>Компонует объекты в древовидные структуры для представления иерархии часть-целое. Позвол...
Компоновщик (схема)
Компоновщик (пример кода) <ul><li>public class Component<T> : IComponent<T> { </li></ul><ul><li>public T Name { get; set;}...
Литература <ul><li>Judith Bishop. C# 3.0 Design Patterns </li></ul><ul><li>Гамма, Хелм, Джонсон и др. Приемы объектно-орие...
Upcoming SlideShare
Loading in …5
×

паттерны программирования

5,583 views
5,386 views

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
5,583
On SlideShare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
36
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • паттерны программирования

    1. 1. Code better 2 Паттерны программирования
    2. 2. Что такое паттерны?.. <ul><li>― Устойчивый узнаваемый способ или подход к решению часто встречающихся проблем ООП. </li></ul><ul><li>Позволяют легко идентифицировать проблему и ее решение буквально словом или словосочетанием. </li></ul><ul><li>Определяют эффективное и зарекомендовавшее себя решение. </li></ul><ul><li>Позволяют улучшить качество документации и сопровождения существующих систем. </li></ul>
    3. 3. Рассматриваемые паттерны <ul><li>Фабричный метод ( Factory Method) </li></ul><ul><li>Одиночка ( Singleton) </li></ul><ul><li>Итератор ( Iterator) </li></ul><ul><li>Адаптер/обертка ( Adapter/Wrapper) </li></ul><ul><li>Прототип ( Prototype) </li></ul><ul><li>Компоновщик ( Composite ) </li></ul>
    4. 4. Фабричный метод (назначение) <ul><li>Определяет интерфейс для создания объектов, при этом выбранный класс инстанциируется подклассами. </li></ul><ul><li>Предоставляет подклассам операции-зацепки ( hooks ) </li></ul><ul><li>Соединяет параллельные иерархии </li></ul>
    5. 5. Фабричный метод (схема)
    6. 6. Фабричный метод (пример кода) <ul><li>using System; </li></ul><ul><li>using System.Collections; </li></ul><ul><li>class FactoryPattern </li></ul><ul><li>{ </li></ul><ul><li>interface IProduct { </li></ul><ul><li>string ShipFrom(); </li></ul><ul><li>} </li></ul><ul><li>class ProductA : IProduct { </li></ul><ul><li>public String ShipFrom() { </li></ul><ul><li>return &quot; from South Africa&quot;; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>class ProductB : IProduct { </li></ul><ul><li>public String ShipFrom() { </li></ul><ul><li>return &quot;from Spain&quot;; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>class DefaultProduct : IProduct { </li></ul><ul><li>public String ShipFrom() { </li></ul><ul><li>return &quot;not available&quot;; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>class Creator { </li></ul><ul><li>public IProduct FactoryMethod(int month) { </li></ul><ul><li>if (month >= 4 && month <= 11) </li></ul><ul><li>return new ProductA(); </li></ul><ul><li>else </li></ul><ul><li>if (month == 1 || month == 2 || month == 12) { return new ProductB(); } else { return new DefaultProduct(); } </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>static void Main() { </li></ul><ul><li>Creator c = new Creator(); </li></ul><ul><li>IProduct product; </li></ul><ul><li>for (int i = 1; i <= 12; i++) { </li></ul><ul><li>product = c.FactoryMethod(i); </li></ul><ul><li>Console.WriteLine(&quot;Avocados &quot; + product.ShipFrom()); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    7. 7. Одиночка (назначение) <ul><li>Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. </li></ul><ul><li>Большая гибкость чем у статических членов класса. </li></ul><ul><li>Допускает переменное число экземпляров. </li></ul><ul><li>Допускает уточнение операций. </li></ul><ul><li>Уменьшает число имен. </li></ul>
    8. 8. Одиночка (схема)
    9. 9. Одиночка (пример кода) <ul><li>public class Singleton { </li></ul><ul><li>// Private constructor </li></ul><ul><li>Singleton() { } </li></ul><ul><li>// Nested class for lazy instantiation </li></ul><ul><li>class SingletonCreator { </li></ul><ul><li>static SingletonCreator() { } </li></ul><ul><li>// Private object instantiated with private constructor </li></ul><ul><li>internal static readonly Singleton uniqueInstance = new Singleton(); </li></ul><ul><li>} </li></ul><ul><li>// Public static property to get the object </li></ul><ul><li>public static Singleton UniqueInstance { </li></ul><ul><li>get { return SingletonCreator.uniqueInstance; } </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    10. 10. Итератор (назначение) <ul><li>Предоставляет способ последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего строения. </li></ul><ul><li>Поддерживает различные виды обхода агрегата. </li></ul><ul><li>Одновременно для агрегата может быть активно несколько обходов. </li></ul>
    11. 11. Итератор (схема)
    12. 12. Итератор (пример кода) <ul><li>using System; </li></ul><ul><li>using System.Collections; </li></ul><ul><li>class IteratorPattern { </li></ul><ul><li>class MonthCollection : IEnumerable { </li></ul><ul><li>string[] months = { &quot;January&quot;, &quot;February&quot;, &quot;March&quot;, &quot;April&quot;, &quot;May&quot;, &quot;June&quot;, </li></ul><ul><li>&quot;July&quot;, &quot;August&quot;, &quot;September&quot;, &quot;October&quot;, &quot;November&quot;, &quot;December&quot;}; </li></ul><ul><li>public IEnumerator GetEnumerator() { </li></ul><ul><li>// Generates values from the collection </li></ul><ul><li>foreach (string element in months) </li></ul><ul><li>yield return element; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>static void Main() { </li></ul><ul><li>MonthCollection collection = new MonthCollection(); </li></ul><ul><li>// Consumes values generated from collection's GetEnumerator method </li></ul><ul><li>foreach (string n in collection) </li></ul><ul><li>Console.Write(n + &quot; &quot;); </li></ul><ul><li>Console.WriteLine(&quot; &quot;); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    13. 13. Адаптер (назначение) <ul><li>Преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты. </li></ul>
    14. 14. Адаптер (схема)
    15. 15. Адаптер (пример кода) <ul><li>using System; </li></ul><ul><li>// Existing way requests are implemented </li></ul><ul><li>class Adaptee { </li></ul><ul><li>// Provide full precision </li></ul><ul><li>public double SpecificRequest(double a, double b) { </li></ul><ul><li>return a / b; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>// Required standard for requests </li></ul><ul><li>interface ITarget { </li></ul><ul><li>// Rough estimate required </li></ul><ul><li>string Request(int i); </li></ul><ul><li>} </li></ul><ul><li>// Implementing the required standard via Adaptee </li></ul><ul><li>class Adapter : Adaptee, ITarget { </li></ul><ul><li>public string Request(int i) { </li></ul><ul><li>return &quot;Rough estimate is &quot; + (int) Math.Round(SpecificRequest(i, 3)); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>class Client { </li></ul><ul><li>static void Main() { </li></ul><ul><li>// Showing the Adapteee in standalone mode </li></ul><ul><li>Adaptee first = new Adaptee(); </li></ul><ul><li>Console.Write(&quot;Before the new standard Precise reading: &quot;); </li></ul><ul><li>Console.WriteLine(first.SpecificRequest(5, 3)); </li></ul><ul><li>// What the client really wants </li></ul><ul><li>ITarget second = new Adapter(); </li></ul><ul><li>Console.WriteLine(&quot; Moving to the new standard&quot;); </li></ul><ul><li>Console.WriteLine(second.Request(5)); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    16. 16. Прототип (назначение) <ul><li>Задает виды создаваемых объектов с помощью экземпляра-прототипа, и создает новые объекты путем копирования этого прототипа. </li></ul><ul><li>Добавление и удаление продуктов во время выполнения. </li></ul><ul><li>Спецификация новых объектов путем изменения значений или структуры. </li></ul><ul><li>Динамическое конфигурирование приложения классами. </li></ul>
    17. 17. Прототип (схема)
    18. 18. Прототип (пример кода) <ul><li>using System; </li></ul><ul><li>using System.Collections.Generic; </li></ul><ul><li>using System.Runtime.Serialization; </li></ul><ul><li>using System.Runtime.Serialization.Formatters.Binary; </li></ul><ul><li>[Serializable()] </li></ul><ul><li>public abstract class IPrototype<T> { </li></ul><ul><li>// Shallow copy </li></ul><ul><li>public T Clone() { </li></ul><ul><li>return (T) this.MemberwiseClone(); </li></ul><ul><li>} </li></ul><ul><li>// Deep Copy </li></ul><ul><li>public T DeepCopy() { </li></ul><ul><li>MemoryStream stream = new MemoryStream(); </li></ul><ul><li>BinaryFormatter formatter = new BinaryFormatter(); </li></ul><ul><li>formatter.Serialize(stream, this); </li></ul><ul><li>stream.Seek(0, SeekOrigin.Begin); </li></ul><ul><li>T copy = (T) formatter.Deserialize(stream); </li></ul><ul><li>stream.Close(); </li></ul><ul><li>return copy; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    19. 19. Компоновщик (назначение ) <ul><li>Компонует объекты в древовидные структуры для представления иерархии часть-целое. Позволяет клиентам единообразно трактовать индивидуальные и составные объекты. </li></ul><ul><li>Упрощает архитектуру клиента. </li></ul><ul><li>Облегчает добавление новых видов компонентов. </li></ul><ul><li>Способствует созданию общего дизайна. </li></ul>
    20. 20. Компоновщик (схема)
    21. 21. Компоновщик (пример кода) <ul><li>public class Component<T> : IComponent<T> { </li></ul><ul><li>public T Name { get; set;} </li></ul><ul><li>public Component(T name) { </li></ul><ul><li>Name = name; </li></ul><ul><li>} </li></ul><ul><li>public void Add(IComponent<T> c) { </li></ul><ul><li>Console.WriteLine(&quot;Cannot add to an item&quot;); </li></ul><ul><li>} </li></ul><ul><li>public IComponent<T> Remove(T s) { </li></ul><ul><li>Console.WriteLine(&quot;Cannot remove directly&quot;); </li></ul><ul><li>return this; </li></ul><ul><li>} </li></ul><ul><li>public IComponent<T> Find(T s) { </li></ul><ul><li>return (s.Equals(Name)) ? this : null; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>public class Composite<T> : IComponent<T> { </li></ul><ul><li>List<IComponent<T>> list; </li></ul><ul><li>public T Name { get; set;} </li></ul><ul><li>public Composite(T name) { </li></ul><ul><li>Name = name; </li></ul><ul><li>list = new List<IComponent<T>>(); </li></ul><ul><li>} </li></ul><ul><li>public void Add(IComponent<T> c) { </li></ul><ul><li>list.Add(c); </li></ul><ul><li>} </li></ul><ul><li>IComponent<T> holder = null; </li></ul><ul><li>public void Remove(T s) { </li></ul><ul><li>... </li></ul><ul><li>(holder as Composite<T>).list.Remove(Find(s)); </li></ul><ul><li>} </li></ul><ul><li>public IComponent<T> Find(T s) { </li></ul><ul><li>... </li></ul><ul><li>return found; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    22. 22. Литература <ul><li>Judith Bishop. C# 3.0 Design Patterns </li></ul><ul><li>Гамма, Хелм, Джонсон и др. Приемы объектно-ориентированного программирования: паттерны программирования </li></ul><ul><li>Buschmann, Henney, Schmidt. Pattern-Oriented Software Architecture. </li></ul><ul><li>Christopher Lasater. Design Patterns. </li></ul>

    ×