Определение шаблона построителя. Шаблон построителя отделяет спецификацию сложного объекта от его фактической конструкции. Один и тот же процесс построения может создавать разные представления.
ну, у меня есть пример кода шаблона Builder, подобный этому
class Director
{
// Build a Product from several parts
public void Construct(IBuilder builder)
{
builder.BuildPartA();
builder.BuildPartB();
builder.BuildPartB();
}
}
interface IBuilder
{
void BuildPartA();
void BuildPartB();
Product GetResult();
}
class Builder1 : IBuilder
{
private Product product = new Product();
public void BuildPartA()
{
product.Add("PartA ");
}
public void BuildPartB()
{
product.Add("PartB ");
}
public Product GetResult()
{
return product;
}
}
class Builder2 : IBuilder
{
private Product product = new Product();
public void BuildPartA()
{
product.Add("PartX ");
}
public void BuildPartB()
{
product.Add("PartY ");
}
public Product GetResult()
{
return product;
}
}
class Product
{
List<string> parts = new List<string>();
public void Add(string part)
{
parts.Add(part);
}
public void Display()
{
Console.WriteLine("\nProduct Parts -------");
foreach (string part in parts)
Console.Write(part);
Console.WriteLine();
}
}
public class Client
{
public static void Main()
{
// Create one director and two builders
Director director = new Director();
IBuilder b1 = new Builder1();
IBuilder b2 = new Builder2();
// Construct two products
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Display();
director.Construct(b2);
Product p2 = b2.GetResult();
p2.Display();
Console.Read();
}
}
Теперь я внес некоторые изменения в приведенный выше код. Представляет ли приведенный ниже код шаблон Builder?
class Director
{
public void Construct(IBuilder builder)
{
builder.BuildPartA();
builder.BuildPartB();
builder.GetResult();
}
}
interface IBuilder
{
void BuildPartA();
void BuildPartB();
void GetResult();
}
class Builder1 : IBuilder
{
List<string> product = new List<string>();
public void BuildPartA()
{
product.Add("PartA ");
}
public void BuildPartB()
{
product.Add("PartB ");
}
public void GetResult()
{
foreach (var p in product)
{
Console.WriteLine("the product created is :" + p);
}
}
}
class Builder2 : IBuilder
{
List<string> product = new List<string>();
public void BuildPartA()
{
product.Add("PartX ");
}
public void BuildPartB()
{
product.Add("PartY ");
}
public void GetResult()
{
foreach (var p in product)
{
Console.WriteLine("the product created is :" + p);
}
}
}
public class Client
{
public static void Main()
{
Director director = new Director();
IBuilder b1 = new Builder1();
IBuilder b2 = new Builder2();
director.Construct(b1);
director.Construct(b2);
Console.Read();
}
}
Примечание:
Я удалил класс продукта из второго примера кода.
Мой вопрос: создание класса, который обрабатывает все объекты и вызывает метод упорядоченным образом, делает его шаблоном Builder? Просто хотел убедиться, что я понял концепцию Builder Pattern. заранее спасибо
ОБНОВЛЕНИЕ 1
я действительно не мог понять, почему второй образец не является шаблоном Builder. Позвольте мне создать второй пример, который будет прост для понимания и для других, чтобы помочь мне понять. Ниже приведен код.
interface IRoutine {
void WakeUp();
void GoToSchool();
void ListenToMusic();
void Sleep();
}
class person1 : IRoutine
{
public void GoToSchool()
{
Console.WriteLine("going to school");
}
public void ListenToMusic()
{
Console.WriteLine("litening to music");
}
public void Sleep()
{
Console.WriteLine("tring to sleep");
}
public void WakeUp()
{
Console.WriteLine("good morning !!!");
}
}
class person2 : IRoutine
{
public void GoToSchool()
{
Console.WriteLine("going to school");
}
public void ListenToMusic()
{
Console.WriteLine("litening to music");
}
public void Sleep()
{
Console.WriteLine("tring to sleep");
}
public void WakeUp()
{
Console.WriteLine("good morning !!!");
}
}
class Builder {
public void Construct(IRoutine routine) {
routine.WakeUp();
routine.GoToSchool();
routine.ListenToMusic();
routine.Sleep();
}
}
class Client {
static void Main() {
Builder builder = new Builder();
IRoutine r1 = new person1();
IRoutine r2 = new person2();
builder.Construct(r1);
builder.Construct(r2);
Console.Read();
}
}
Является ли недавний пример, который я предоставил шаблоном Builder? Если нет, то почему это не шаблон Builder, пожалуйста, помогите мне понять.