порождающий шаблон проектирования, который отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.
Плюсы
позволяет изменять внутреннее представление продукта
изолирует код, реализующий конструирование и представление
дает более тонкий контроль над процессом конструирования
Применение
алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой
процесс конструирования должен обеспечивать различные представления конструируемого объекта
Плюсы
Применение
type
TPizza = class(TObject)
strict private
FDough, FSauce, FTopping: string;
public
property Dough: string write FDough;
property Sauce: string write FSauce;
property Topping: string write FTopping;
procedure Show();
end;
// Abstract Builder
TPizzaBuilder = class(TObject)
strict protected
FPizza: TPizza;
public
property Pizza: TPizza read FPizza;
constructor Create();
destructor Destroy(); override;
procedure CreateNewPizzaProduct();
procedure BuildDough(); virtual; abstract;
procedure BuildSauce(); virtual; abstract;
procedure BuildTopping(); virtual; abstract;
end;
// Concrete Builder A
THawaiianPizzaBuilder = class(TPizzaBuilder)
public
procedure BuildDough(); override;
procedure BuildSauce(); override;
procedure BuildTopping(); override;
end;
// Concrete Builder B
TSpicyPizzaBuilder = class(TPizzaBuilder)
public
procedure BuildDough(); override;
procedure BuildSauce(); override;
procedure BuildTopping(); override;
end;
// Director
TWaiter = class(TObject)
strict private
FPizzaBuilder: TPizzaBuilder;
public
property PizzaBuilder: TPizzaBuilder write FPizzaBuilder;
constructor Create();
destructor Destroy(); override;
procedure ConstructPizza();
function GetPizza(): TPizza;
end;
{ TPizza }
procedure TPizza.Show();
begin
WriteLn('Pizza with Dough as ' + FDough + ', sauce as ' + FSauce + ' and Topping as ' + FTopping + '!');
end;
{ TPizzaBuilder }
constructor TPizzaBuilder.Create();
begin
FPizza := nil;
end;
destructor TPizzaBuilder.Destroy();
begin
if FPizza <> nil then
FPizza.Free();
inherited Destroy();
end;
procedure TPizzaBuilder.CreateNewPizzaProduct();
begin
if FPizza <> nil then
FPizza.Free();
FPizza := TPizza.Create();
end;
{ THawaiianPizzaBuilder }
procedure THawaiianPizzaBuilder.BuildDough();
begin
if FPizza <> nil then
FPizza.Dough := 'cross';
end;
procedure THawaiianPizzaBuilder.BuildSauce();
begin
if FPizza <> nil then
FPizza.Sauce := 'mild';
end;
procedure THawaiianPizzaBuilder.BuildTopping();
begin
if FPizza <> nil then
FPizza.Topping := 'ham and pineapple';
end;
{ TSpicyPizzaBuilder }
procedure TSpicyPizzaBuilder.BuildDough();
begin
if FPizza <> nil then
FPizza.Dough := 'pan baked';
end;
procedure TSpicyPizzaBuilder.BuildSauce();
begin
if FPizza <> nil then
FPizza.Sauce := 'hot';
end;
procedure TSpicyPizzaBuilder.BuildTopping();
begin
if FPizza <> nil then
FPizza.Topping := 'pepperoni and salami';
end;
{ TWaiter }
constructor TWaiter.Create();
begin
FPizzaBuilder := nil;
end;
destructor TWaiter.Destroy();
begin
FPizzaBuilder := nil;
inherited Destroy();
end;
procedure TWaiter.ConstructPizza();
begin
if FPizzaBuilder <> nil then
begin
FPizzaBuilder.CreateNewPizzaProduct();
FPizzaBuilder.BuildDough();
FPizzaBuilder.BuildSauce();
FPizzaBuilder.BuildTopping();
end;
end;
function TWaiter.GetPizza(): TPizza;
begin
if FPizzaBuilder <> nil then
Result := FPizzaBuilder.Pizza
else
Result := nil;
end;
var
Waiter: TWaiter;
HawaiianPizzaBuilder: THawaiianPizzaBuilder;
SpicyPizzaBuilder: TSpicyPizzaBuilder;
Pizza: TPizza;
begin
HawaiianPizzaBuilder := THawaiianPizzaBuilder.Create();
SpicyPizzaBuilder := TSpicyPizzaBuilder.Create();
Waiter := TWaiter.Create();
// Client has ordered two pizzas
// Pizza "A"
Waiter.PizzaBuilder := HawaiianPizzaBuilder;
Waiter.ConstructPizza();
Pizza := Waiter.GetPizza();
Pizza.Show();
Pizza.Free();
//Pizza "B"
Waiter.PizzaBuilder := SpicyPizzaBuilder;
Waiter.ConstructPizza();
Pizza := Waiter.GetPizza();
Pizza.Show();
Pizza.Free();
ReadLn;
Waiter.Free();
HawaiianPizzaBuilder.Free();
SpicyPizzaBuilder.Free();
end.
Комментариев нет:
Отправить комментарий