- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 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.12.2013 19:23 # 0
bormand 29.12.2013 19:30 # +1
bormand 29.12.2013 19:32 # 0
kegdan 29.12.2013 19:37 # 0
>>Главное чтобы не по по печёнке раздавали ;)
По печёнке разве что мне за такие посты)
bormand 29.12.2013 19:47 # 0
Ты не поверишь, но, продукт всегда делается одним билдером. Просто ты можешь заменить билдера на другого. Емнип в этом суть паттерна :)
> Using там, где aggregation, aggregation там, где using.
А я не умею читать UML диаграммы. Вот такой вот я неуч. Всегда читаю их от балды, додумывая смысл, т.к. влом учить какая стрелка что означает...
P.S. И вообще, что означает стрелка между билдером и директором? Я такой найти нигде не могу...
kegdan 29.12.2013 19:51 # 0
эээ, а в чем тогда отличие от той же фабрики?
>>А я не умею читать UML диаграммы. Вот такой вот я неуч. Всегда читаю их от балды, додумывая смысл, т.к. влом учить какая стрелка что означает...
Стрелка - содержит. стрелка в обе стороны - оба класса "знают" друг о друге. ромб - содержит лист, белый - отношение директор - подчиненые, черный - отношение организм - органы
bormand 29.12.2013 19:55 # 0
В том, что у билдера несколько шагов, а фабрика сразу знает, чего и как запилить?
P.S. Если паттерны разбирать на простых примерах, вроде приведенного выше - они кажутся говном и оверкиллом. А если их разбирать на реальной ситуации, где они действительно удобны, то пример займет тонну листов, и никто его не дочитает :)
kegdan 29.12.2013 20:09 # 0
Ну так создание обьекта в фабрике от нас скрыто - можно запилить аналогичную последовательность конструинования.
или директор выбирает еще и последовательность вызова функций? То есть в зависимости от контекста он строит обьект из разного сочитания частей. Но опять же в патерне это не указано явно.
А на схеме показано, что он берет все билдеры, поочереди пропускает через них продукт и получает конфетку.
>>P.S. Если паттерны разбирать на простых примерах, вроде приведенного выше - они кажутся говном и оверкиллом. А если их разбирать на реальной ситуации, где они действительно удобны, то пример займет тонну листов, и никто его не дочитает :)
Не подскажете где можно полуркать?
bormand 29.12.2013 20:16 # 0
Имхо да, и еще он каждому этапу может передавать параметры. Ну вот взгляни на UriBuilder в жабе или решетках. Мне кажется, что это типичный пример - настраиваем кучу параметров в билдере и просим его запилить продукт.
> А на схеме показано, что он берет все билдеры, поочереди пропускает через них продукт и получает конфетку.
Где эту схему можно посмотреть?
> Не подскажете где можно полуркать?
Х.з. Я не особо люблю паттерны.
kegdan 29.12.2013 20:28 # 0
сорри, перепутал. Там для каждой части структуры вызывается builder.BuildPart(), что тоже не совсем ясно.
Короче, я понял, что нужно перечитывать банду четырех)
bormand 29.12.2013 20:05 # 0
kegdan 29.12.2013 20:12 # 0