
Диаграмма классов
Строитель
Описание
Отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.
Преимущества
Позволяет изменять внутреннее представление продукта;
Изолирует код, реализующий конструирование и представление;
Дает более тонкий контроль над процессом конструирования.
Недостатки
Данный шаблон не скрывает реализацию порождаемых объектов, а создает то, что требуется;
Как следствие, результатом работы могут быть объекты, не связанные явно между собой. Как правило, у них единые цели, но не обязательно есть общие интерфейсы, базовые классы и т.д.
Детали реализации
public interface IPageBuilder
{
void BuildHeader(HeaderData header);
void BuildMenu(MenuItems items);
void BuildPost(PostData post);
void BuildFooter(FooterData footer);
}
public class PageDirector
{
private readonly IPageBuilder _builder;
private static HeaderData GetHeader(int pageId) { return new HeaderData(pageId); }
private static MenuItems GetMenuItems(int pageId) { return new MenuItems(pageId); }
private static IEnumerable<PostData> GetPosts(int pageId)
{
return new List<PostData>
{
new PostData(pageId),
new PostData(pageId)
};
}
private static FooterData GetFooter(int pageId) { return new FooterData(pageId); }
public PageDirector(IPageBuilder builder)
{
_builder = builder;
}
public void BuildPage(int pageId)
{
_builder.BuildHeader(GetHeader(pageId));
_builder.BuildMenu(GetMenuItems(pageId));
foreach (var post in GetPosts(pageId))
{
_builder.BuildPost(post);
}
_builder.BuildFooter(GetFooter(pageId));
}
}
public class PageBuilder : IPageBuilder
{
private readonly Page _page = new Page();
public void BuildHeader(HeaderData header) { _page.AddHeader(header); }
public void BuildMenu(MenuItems menuItems) { _page.SetMenuItems(menuItems); }
public void BuildPost(PostData post) { _page.AddPost(post); }
public void BuildFooter(FooterData footer) { _page.AddFooter(footer); }
public Page GetResult() { return _page; }
}
public class PrintPageBuilder : IPageBuilder
{
private readonly Page _page = new Page();
private static PostData PreparePostToPrinter(Data.Data post)
{
return new PostData { Text = "PrintPost" + post.Text.Last() };
}
public void BuildHeader(HeaderData header) { }
public void BuildMenu(MenuItems menuItems) { }
public void BuildPost(PostData post)
{
var postToPrint = PreparePostToPrinter(post);
_page.AddPost(postToPrint);
}
public void BuildFooter(FooterData footer) { }
public Page GetResult() { return _page; }
}
class Program
{
static void Main(string[] args)
{
var pageBuilder = new PageBuilder();
new PageDirector(pageBuilder).BuildPage(1);
var page = pageBuilder.GetResult();
Post(page);
Console.WriteLine();
Console.WriteLine();
var pageBuilder2 = new PrintPageBuilder();
new PageDirector(pageBuilder2).BuildPage(2);
var page2 = pageBuilder2.GetResult();
Post(page2);
Console.ReadKey();
}
private static void Post(Page page)
{
page.Print();
}
}