标签:des style blog http io ar os for sp

{《HeadFirst设计模式》工厂模式之抽象工厂 }
{ 抽象工厂的产品 }
{ 编译工具:Delphi7.0 }
{ E-Mail :guzh-0417@163.com }
unit uPizzaIngredient;
interface
type
TDough = class(TObject)
end;
TThinCrustDough = class(TDough)
end;
TThickCrustDough = class(TDough)
end;
////////////////////////////////
TSauce = class(TObject)
end;
TMarinaraSauce = class(TSauce)
end;
TPlumTomatoSauce = class(TSauce)
end;
////////////////////////////////
TCheese = class(TObject)
end;
TReggianoCheese = class(TCheese)
end;
TMozzarellaCheese = class(TCheese)
end;
//////////////////////////////////
TPepperoni = class(TObject)
end;
TSlicedPepperoni = class(TPepperoni)
end;
////////////////////////////////////
TClams = class(TObject)
end;
TFreshClams = class(TClams)
end;
TFrozenClams = class(TClams)
end;
implementation
end.
{《HeadFirst设计模式》工厂模式之抽象工厂 }
{ 抽象工厂 }
{ 编译工具:Delphi7.0 }
{ E-Mail :guzh-0417@163.com }
unit uPizzaIngredientFactory;
interface
uses
uPizzaIngredient;
type
TPizzaIngredientFactory = class(TObject)
public
function CreateDough: TDough; virtual; abstract;
function CreateSauce: TSauce; virtual; abstract;
function CreateCheese: TCheese; virtual; abstract;
function CreatePepperoni: TPepperoni; virtual; abstract;
function CreateClams: TClams; virtual; abstract;
end;
TNYPizzaIngredientFactory = class(TPizzaIngredientFactory)
public
function CreateDough: TDough; override;
function CreateSauce: TSauce; override;
function CreateCheese: TCheese; override;
function CreatePepperoni: TPepperoni; override;
function CreateClams: TClams; override;
end;
TChicagoPizzaIngredientFactory = class(TPizzaIngredientFactory)
public
function CreateDough: TDough; override;
function CreateSauce: TSauce; override;
function CreateCheese: TCheese; override;
function CreatePepperoni: TPepperoni; override;
function CreateClams: TClams; override;
end;
implementation
{ TNYPizzaIngredientFactory }
function TNYPizzaIngredientFactory.CreateCheese: TCheese;
begin
Result := TReggianoCheese.Create;
end;
function TNYPizzaIngredientFactory.CreateClams: TClams;
begin
Result := TFreshClams.Create;
end;
function TNYPizzaIngredientFactory.CreateDough: TDough;
begin
Result := TThinCrustDough.Create;
end;
function TNYPizzaIngredientFactory.CreatePepperoni: TPepperoni;
begin
Result := TSlicedPepperoni.Create;
end;
function TNYPizzaIngredientFactory.CreateSauce: TSauce;
begin
Result := TMarinaraSauce.Create;
end;
{ TChicagoPizzaIngredientFactory }
function TChicagoPizzaIngredientFactory.CreateCheese: TCheese;
begin
Result := TMozzarellaCheese.Create;
end;
function TChicagoPizzaIngredientFactory.CreateClams: TClams;
begin
Result := TFrozenClams.Create;
end;
function TChicagoPizzaIngredientFactory.CreateDough: TDough;
begin
Result := TThickCrustDough.Create;
end;
function TChicagoPizzaIngredientFactory.CreatePepperoni: TPepperoni;
begin
Result := TSlicedPepperoni.Create;
end;
function TChicagoPizzaIngredientFactory.CreateSauce: TSauce;
begin
Result := TPlumTomatoSauce.Create;
end;
end.
{《HeadFirst设计模式》工厂模式之抽象工厂 }
{ 抽象工厂的用户 }
{ 编译工具:Delphi7.0 }
{ E-Mail :guzh-0417@163.com }
unit uPizza;
interface
uses
uPizzaIngredient, uPizzaIngredientFactory;
type
TPizza = class(TObject)
private
procedure SetName(const Value: string);
protected
FName: string;
FDough: TDough;
FSauce: TSauce;
FCheese: TCheese;
FPepperoni: TPepperoni;
FClams: TClams;
FIngredientFactory: TPizzaIngredientFactory;
public
constructor Create(aIngredientFactory: TPizzaIngredientFactory);
procedure Prepare; virtual; abstract;
procedure Bake;
procedure Cut;
procedure Box;
property Name: string read FName write SetName;
end;
TCheesePizza = class(TPizza)
public
destructor Destroy; override;
procedure Prepare; override;
end;
TClamsPizza = class(TPizza)
public
destructor Destroy; override;
procedure Prepare; override;
end;
implementation
{ TPizza }
procedure TPizza.Bake;
begin
Writeln(‘Bake for 25 minutes at 350‘);
end;
procedure TPizza.Box;
begin
Writeln(‘Place pizza in official PizzaStore box‘);
end;
constructor TPizza.Create(aIngredientFactory: TPizzaIngredientFactory);
begin
Self.FIngredientFactory := aIngredientFactory;
end;
procedure TPizza.Cut;
begin
Writeln(‘Cutting the pizza into diagonal slices‘);
end;
procedure TPizza.SetName(const Value: string);
begin
FName := Value;
end;
{ TCheesePizza }
destructor TCheesePizza.Destroy;
begin
FDough.Free;
FSauce.Free;
FCheese.Free;
inherited;
end;
procedure TCheesePizza.Prepare;
begin
Writeln(‘Preparing ‘ + Name);
FDough := FIngredientFactory.CreateDough;
FSauce := FIngredientFactory.CreateSauce;
FCheese := FIngredientFactory.CreateCheese;
end;
{ TClamsPizza }
destructor TClamsPizza.Destroy;
begin
FDough.Free;
FSauce.Free;
FCheese.Free;
FClams.Free;
inherited;
end;
procedure TClamsPizza.Prepare;
begin
Writeln(‘Preparing ‘ + Name);
FDough := FIngredientFactory.CreateDough;
FSauce := FIngredientFactory.CreateSauce;
FCheese := FIngredientFactory.CreateCheese;
FClams := FIngredientFactory.CreateClams;
end;
end.
{《HeadFirst设计模式》工厂模式之抽象工厂 }
{ Pizza的用户 }
{ 编译工具:Delphi7.0 }
{ E-Mail :guzh-0417@163.com }
unit uPizzaStore;
interface
uses
uPizza, uPizzaIngredientFactory;
type
TPizzaStore = class(TObject)
protected
FPizza: TPizza;
FIngredientFactory: TPizzaIngredientFactory;
public
destructor Destroy; override;
function OrderPizza(Category: Integer): TPizza;
function CreatePizza(Style: Integer): TPizza; virtual; abstract;
end;
TNYPizzaStore = class(TPizzaStore)
public
function CreatePizza(Style: Integer): TPizza; override;
end;
TChicagoPizzaStore = class(TPizzaStore)
public
function CreatePizza(Style: Integer): TPizza; override;
end;
implementation
{ TPizzaStore }
destructor TPizzaStore.Destroy;
begin
FPizza.Free;
FIngredientFactory.Free;
inherited;
end;
function TPizzaStore.OrderPizza(Category: Integer): TPizza;
begin
FPizza := CreatePizza(Category);
FPizza.Prepare;
FPizza.Bake;
FPizza.Cut;
FPizza.Box;
Result := FPizza;
end;
{ TNYPizzaStore }
function TNYPizzaStore.CreatePizza(Style: Integer): TPizza;
begin
FIngredientFactory := TNYPizzaIngredientFactory.Create;
FPizza := nil;
case Style of
0: begin
FPizza := TCheesePizza.Create(FIngredientFactory);
FPizza.Name := ‘New York Style Cheese Pizza‘;
end;
1: begin
FPizza := TClamsPizza.Create(FIngredientFactory);
FPizza.Name := ‘New York Style Clams Pizza‘;
end;
//2: 其它风味的 New York Pizza
//
end;
Result := FPizza;
end;
{ TChicagoPizzaStore }
function TChicagoPizzaStore.CreatePizza(Style: Integer): TPizza;
begin
FIngredientFactory := TChicagoPizzaIngredientFactory.Create;
case Style of
0: begin
Result := TCheesePizza.Create(FIngredientFactory);
Result.Name := ‘Chicago Style Cheese Pizza‘;
end;
1: begin
Result := TClamsPizza.Create(FIngredientFactory);
Result.Name := ‘Chicago Style Clams Pizza‘;
end;
//2: 其它风味的 Chicago Pizza
//
else
Result := nil;
end;
end;
end.
{《HeadFirst设计模式》工厂模式之抽象工厂 }
{ 客户端 }
{ 编译工具:Delphi7.0 }
{ E-Mail :guzh-0417@163.com }
program pPizzaStore;
{$APPTYPE CONSOLE}
uses
uPizzaIngredient in ‘uPizzaIngredient.pas‘,
uPizzaIngredientFactory in ‘uPizzaIngredientFactory.pas‘,
uPizza in ‘uPizza.pas‘,
uPizzaStore in ‘uPizzaStore.pas‘;
var
PizzaStore: TPizzaStore;
Pizza: TPizza;
begin
PizzaStore := TNYPizzaStore.Create;
Pizza := PizzaStore.OrderPizza(0);
Writeln(‘Ethan ordered a ‘ + Pizza.Name);
Writeln;
Pizza := PizzaStore.OrderPizza(1);
Writeln(‘Ethan ordered a ‘ + Pizza.Name);
PizzaStore.Free;
Writeln;
Writeln(‘ ********************************** ‘);
Writeln;
PizzaStore := TChicagoPizzaStore.Create;
Pizza := PizzaStore.OrderPizza(0);
Writeln(‘Joel ordered a ‘ + Pizza.Name);
Writeln;
Pizza := PizzaStore.OrderPizza(1);
Writeln(‘Joel ordered a ‘ + Pizza.Name);
PizzaStore.Free;
Readln;
end.
Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]
标签:des style blog http io ar os for sp
原文地址:http://www.cnblogs.com/0x2D-0x22/p/4076408.html