Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шаблоны и архитектура программ.doc
Скачиваний:
12
Добавлен:
04.05.2019
Размер:
558.08 Кб
Скачать

Строитель (Builder)

Шаблон Строитель позволяет клиенту создавать сложный объект, задавая для него только тип и содержимое. Одинаковый процесс создания способен порождать различные объекты.

Рассмотрим дизайн шаблона Строитель. В его основе лежит компонент Director (режиссер), который вызывает объекты-строители. Количество объектов-строителей произвольно, однако все они реализуют интерфейс IBuilder. Строители поставляют элементы для создания финального объекта Product. Как только объект Product будет создан, компонент Director предоставляет его клиенту.

Рис. 14. Дизайн шаблона Строитель.

Пример кода с реализацией шаблона Строитель основан на примере для шаблона Абстрактная фабрика.

using System;

using System.Threading;

public interface IBuilder

{

IBag CreateBag();

}

public class Builder<TBrand> : IBuilder where TBrand : IBrand, new()

{

private readonly TBrand myBrand = new TBrand();

public IBag CreateBag()

{

return myBrand.CreateBag();

}

}

public interface IBag

{

string Properties { get; set; }

}

public class Bag : IBag

{

public string Properties { get; set; }

}

public interface IBrand

{

IBag CreateBag();

}

public class Gucci : IBrand

{

public IBag CreateBag()

{

var b = new Bag();

BuilderExample.DoWork("Cut Leather", 250);

BuilderExample.DoWork("Sew leather", 1000);

b.Properties += "Leather";

BuilderExample.DoWork("Create Lining", 500);

BuilderExample.DoWork("Attach Lining", 1000);

b.Properties += " lined";

BuilderExample.DoWork("Add Label", 250);

b.Properties += " with label";

return b;

}

}

public class Poochy : IBrand

{

public IBag CreateBag()

{

var b = new Bag();

BuilderExample.DoWork("Hire cheap labour", 200);

BuilderExample.DoWork("Cut Plastic", 125);

BuilderExample.DoWork("Sew Plastic", 500);

b.Properties += "Plastic";

BuilderExample.DoWork("Add Label", 100);

b.Properties += " with label";

return b;

}

}

public class Client<TBrand> where TBrand : IBrand, new()

{

public void ClientMain()

{

IBuilder factory = new Builder<TBrand>();

var date = DateTime.Now;

Console.WriteLine("I want to buy a bag!");

var bag = factory.CreateBag();

Console.WriteLine("I got my Bag which took " +

DateTime.Now.Subtract(date).TotalSeconds * 5 + " days");

Console.WriteLine("with the following properties " +

bag.Properties);

}

}

public static class BuilderExample

{

private static void Main()

{

new Client<Poochy>().ClientMain();

new Client<Gucci>().ClientMain();

}

public static void DoWork(string workitem, int time)

{

Console.Write("{0} : 0%", workitem);

Thread.Sleep(time);

Console.Write("....25%");

Thread.Sleep(time);

Console.Write("....50%");

Thread.Sleep(time);

Console.WriteLine("....100%");

}

}