- •А.А. Волосевич
- •3. Шаблоны и архитектура программ
- •3.1. Модульное тестирование
- •3.2. Шаблоны проектирования
- •3.3. Структурные шаблоны: Декоратор, Заместитель, мост Декоратор (Decorator)
- •Заместитель (Proxy)
- •Мост (Bridge)
- •3.4. Структурные шаблоны: компоновщик и приспособленец Компоновщик (Composite)
- •Приспособленец (Flyweight)
- •3.5. Структурные шаблоны: адаптер и фасад Адаптер (Adapter)
- •Фасад (Façade)
- •3.6. Порождающие шаблоны: прототип, фабричный метод, одиночка Прототип (Prototype)
- •Фабричный метод (Factory method)
- •Одиночка (Singleton)
- •3.7. Порождающие шаблоны: абстрактная фабрика и строитель Абстрактная фабрика (Abstract factory)
- •Строитель (Builder)
- •3.8. Шаблоны поведения: стратегия, состояние, шаблонный метод Стратегия (Strategy)
- •Состояние (State)
- •Шаблонный метод (Template method)
- •3.9. Шаблоны поведения: цепочка обязанностей и команда Цепочка обязанностей (Chain of responsibility)
- •Команда (Command)
- •3.10. Шаблоны поведения: итератор, посредник, наблюдатель Итератор (Iterator)
- •Посредник (Mediator)
- •Наблюдатель (Observer)
- •3.11. Шаблоны поведения: посетитель, интерпретатор, хранитель Посетитель (Visitor)
- •Интерпретатор (Interpreter)
- •Хранитель (Memento)
- •3.12. Некоторые неклассические шаблоны проектирования
- •Неизменный объект (Immutable object)
- •Пул объектов (Object pool)
- •Отложенная инициализация (Lazy initialization)
- •Нулевой объект (Null object)
- •3.13. Антипаттерны
- •3.14. Архитектура прогРаммного Обеспечения
- •«Клиент-сервер»
- •Архитектура, основанная на использовании компонентов
- •Многоуровневая архитектура
- •Шина сообщений
- •Выделенное представление
- •Объектно-ориентированная архитектура
- •Архитектура, ориентированная на сервисы
Строитель (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%");
}
}