Рисунок 8 Диаграмма классов для шаблона «Строитель»
Класс Director содержит указатель или ссылку на экземпляр одного из дочерних классов Builder, определяющего соответствующе представление. После этого, класс Director может обрабатывать клиентские запросы на создание объекта. Получив такой запрос, с помощью имеющегося экземпляра строителя, Director строит продукт по частям, а затем возвращает его пользователю.
Исходный код:
public abstract class Builder
{
protected abstract Product BuildPart();
public Product GetProduct()
{
return BuildPart();
}
}
public class ConcreteBuilder : Builder
{
protected override Product BuildPart()
{
Product product = new Product();
BuildPart1();
BuildPart2();
return product;
}
private void BuildPart1()
{
}
private void BuildPart2()
{
}
}
public class Director
{
Builder _builder;
public Product Construct()
{
return _builder.GetProduct();
}
}
public class Product
{
}
Пример реализации шаблона «Строитель»
Приведём реализацию шаблона «Строитель» на примере построения армии.
Сделаем классы создания армий двух разных стран: Рим и Карфаген. Для простоты, будем считать, что у каждой страны есть одинаковые типы воинов.
Диаграмма классов выглядит следующим образом:
Рисунок 9 Диаграмма классов реализации создания армии на шаблоне «Строитель»
Исходный код (не показаны классы для типов армий):
public abstract class ArmyBuilder
{
private List _army;
public void CreateArmy()
{
_army = new List();
}
public abstract void AddInfantry();
public abstract void AddArcher();
public abstract void AddHorseman();
public abstract void AddCatapult();
public List Army { get { return _army; } }
}
public class RomanArmyBuilder : ArmyBuilder
{
public override void AddInfantry() { Army.Add(new RomanInfantryman()); }
public override void AddArcher() { Army.Add(new RomanArcher()); }
public override void AddHorseman() { Army.Add(new RomanHorseman()); }
public override void AddCatapult() { Army.Add(new RomanCatapult()); }
}
public class CarthaginianArmyBuilder : ArmyBuilder
{
public override void AddInfantry() { Army.Add(new CarthaginianInfantryman()); }
public override void AddArcher() { Army.Add(new CarthaginianArcher()); }
public override void AddHorseman() { Army.Add(new CarthaginianHorseman()); }
public override void AddCatapult() { Army.Add(new CarthaginianCatapult()); }
}
public class Director
{
public List CreateArmy(ArmyBuilder parArmyBuilder)
{
parArmyBuilder.CreateArmy();
parArmyBuilder.AddInfantry();
parArmyBuilder.AddArcher();
parArmyBuilder.AddHorseman();
parArmyBuilder.AddCatapult();
return parArmyBuilder.Army;
}
}
Если сравнить реализацию построения армии по шаблону «Строитель» с «Абстрактной фабрикой», то видно отличие в том, что в шаблоне «Строитель» скрыта реализация процесса создания армии.
Создание армий двух стран выглядит следующим образом:
Director director = new Director();
RomanArmyBuilder romanArmyBuilder = new RomanArmyBuilder();
CarthaginianArmyBuilder carthaginianArmyBuilder = new CarthaginianArmyBuilder();
List romanArmy = director.CreateArmy(romanArmyBuilder);
List carthaginianArmy = director.CreateArmy(carthaginianArmyBuilder);
Достарыңызбен бөлісу: |