1. C# / Говнокод #14299

    +137

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    using System;
     using System.Collections.Generic;
     namespace Builder
     {
      public class MainApp
      {
        public static void Main()
        {
          // Create director and builders
          Director director = new Director();
     
          Builder b1 = new ConcreteBuilder1();
          Builder b2 = new ConcreteBuilder2();
     
          // Construct two products
          director.Construct(b1);
          Product p1 = b1.GetResult();
          p1.Show();
     
          director.Construct(b2);
          Product p2 = b2.GetResult();
          p2.Show();
     
          // Wait for user
          Console.Read();
        }
      }
      // "Director"
      class Director
      {
        // Builder uses a complex series of steps
        public void Construct(Builder builder)
        {
          builder.BuildPartA();
          builder.BuildPartB();
        }
      }
      // "Builder"
      abstract class Builder
      {
        public virtual void BuildPartA(){}
        public virtual void BuildPartB(){}
        public virtual Product GetResult(){}
      }
      // "ConcreteBuilder1"
      class ConcreteBuilder1 : Builder
      {
        private readonly Product product = new Product();
        public override void BuildPartA()
        {
          product.Add("PartA");
        }
        public override void BuildPartB()
        {
          product.Add("PartB");
        }
        public override Product GetResult()
        {
          return product;
        }
      }
      // "ConcreteBuilder2"
      class ConcreteBuilder2 : Builder
      {
        private readonly Product product = new Product();
        public override void BuildPartA()
        {
          product.Add("PartX");
        }
        public override void BuildPartB()
        {
          product.Add("PartY");
        }
        public override Product GetResult()
        {
          return product;
        }
      }
      // "Product"
      class Product
      {
        private readonly List<string> parts = new List<string>();
        public void Add(string part)
        {
          parts.Add(part);
        }
        public void Show()
        {
          Console.WriteLine("\nProduct Parts -------");
          foreach (string part in parts)
            Console.WriteLine(part);
        }
      }
     }

    "Хороший","годный" пример паттерна билдер с википедии, не соответствующие лежащей там же Uml схеме чуть больше чем полностью

    Схема
    http://upload.wikimedia.org/wikipedia/ru/2/28/Builder.gif

    Запостил: kegdan, 29 Декабря 2013

    Комментарии (12) RSS

    • Тут печенки раздают!
      Ответить
      • Главное чтобы не по по печёнке раздавали ;)
        Ответить
    • А что не так? Вроде все по схеме написали.
      Ответить
      • Using там, где aggregation, aggregation там, где using. Продукт всегда делает один билдер, что несколько затирает смысл паттерна

        >>Главное чтобы не по по печёнке раздавали ;)

        По печёнке разве что мне за такие посты)
        Ответить
        • > Продукт всегда делает один билдер, что несколько затирает смысл паттерна
          Ты не поверишь, но, продукт всегда делается одним билдером. Просто ты можешь заменить билдера на другого. Емнип в этом суть паттерна :)

          > Using там, где aggregation, aggregation там, где using.
          А я не умею читать UML диаграммы. Вот такой вот я неуч. Всегда читаю их от балды, додумывая смысл, т.к. влом учить какая стрелка что означает...

          P.S. И вообще, что означает стрелка между билдером и директором? Я такой найти нигде не могу...
          Ответить
          • >> Ты не поверишь, но, продукт всегда делается одним билдером. Просто ты можешь заменить билдера на другого. Емнип в этом суть паттерна :)

            эээ, а в чем тогда отличие от той же фабрики?

            >>А я не умею читать UML диаграммы. Вот такой вот я неуч. Всегда читаю их от балды, додумывая смысл, т.к. влом учить какая стрелка что означает...

            Стрелка - содержит. стрелка в обе стороны - оба класса "знают" друг о друге. ромб - содержит лист, белый - отношение директор - подчиненые, черный - отношение организм - органы
            Ответить
            • > эээ, а в чем тогда отличие от той же фабрики?
              В том, что у билдера несколько шагов, а фабрика сразу знает, чего и как запилить?

              P.S. Если паттерны разбирать на простых примерах, вроде приведенного выше - они кажутся говном и оверкиллом. А если их разбирать на реальной ситуации, где они действительно удобны, то пример займет тонну листов, и никто его не дочитает :)
              Ответить
              • >>В том, что у билдера несколько шагов, а фабрика сразу знает, чего и как запилить?

                Ну так создание обьекта в фабрике от нас скрыто - можно запилить аналогичную последовательность конструинования.
                или директор выбирает еще и последовательность вызова функций? То есть в зависимости от контекста он строит обьект из разного сочитания частей. Но опять же в патерне это не указано явно.

                А на схеме показано, что он берет все билдеры, поочереди пропускает через них продукт и получает конфетку.

                >>P.S. Если паттерны разбирать на простых примерах, вроде приведенного выше - они кажутся говном и оверкиллом. А если их разбирать на реальной ситуации, где они действительно удобны, то пример займет тонну листов, и никто его не дочитает :)

                Не подскажете где можно полуркать?
                Ответить
                • > или директор выбирает еще и последовательность вызова функций
                  Имхо да, и еще он каждому этапу может передавать параметры. Ну вот взгляни на UriBuilder в жабе или решетках. Мне кажется, что это типичный пример - настраиваем кучу параметров в билдере и просим его запилить продукт.

                  > А на схеме показано, что он берет все билдеры, поочереди пропускает через них продукт и получает конфетку.
                  Где эту схему можно посмотреть?

                  > Не подскажете где можно полуркать?
                  Х.з. Я не особо люблю паттерны.
                  Ответить
                  • >> Где эту схему можно посмотреть?

                    сорри, перепутал. Там для каждой части структуры вызывается builder.BuildPart(), что тоже не совсем ясно.

                    Короче, я понял, что нужно перечитывать банду четырех)
                    Ответить
            • А стрелка и ромб, как на том рисунке?)
              Ответить
              • стрелка в принципе не нужна. Означает что директор содержит множество билдеров, и что при этом, он сам их не создает. а получает из все, и что можно взять билдера от одного директора и засунуть другому. А если ромб черный - то директор сам создает билдеров, они являются его частями и нельзя оторвать билдера от деректора
                Ответить

    Добавить комментарий