您的位置:首页 > 编程语言 > Delphi

Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---工厂模式之工厂方法

2009-11-10 14:28 603 查看
1. 产品类

{《HeadFirst设计模式》工厂模式之工厂方法 }
{ 产品类                              }
{ 编译工具 :Delphi2007 for win32      }
{ 联系方式 :xshlife@163.com         }

unit uProducts;

interface

type
{ abstract Pizza }

TPizza = class abstract(TObject)
strict private
function GetName: string;
strict protected
FName : string;
FDough: string;
FSauce: string;
public
procedure Prepare;
procedure Bake;
procedure Cut; virtual;
procedure Box;
property Name: string read GetName;
end;

{ NY Style Pizza }

TNYStyleCheesePizza = class(TPizza)
public
constructor Create;
end;

TNYStyleClamPizza = class(TPizza)
public
constructor Create;
end;

TNYStylePepperoniPizza = class(TPizza)
public
constructor Create;
end;

TNYStyleVeggiePizza = class(TPizza)
public
constructor Create;
end;

{ Chicago Style Pizza }

TChicagoStyleCheesePizza = class(TPizza)
public
constructor Create;
procedure Cut; override;
end;

TChicagoStyleClamPizza = class(TPizza)
public
constructor Create;
procedure Cut; override;
end;

TChicagoStylePepperoniPizza = class(TPizza)
public
constructor Create;
procedure Cut; override;
end;

TChicagoStyleVeggiePizza = class(TPizza)
public
constructor Create;
procedure Cut; 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;

procedure TPizza.Cut;
begin
Writeln('Cutting the pizza into diaginal slices');
end;

function TPizza.GetName: string;
begin
Result := FName;
end;

procedure TPizza.Prepare;
begin
Writeln('Preparing ' + FName);
Writeln('Tossing dough ');
Writeln('Adding sauce ');
Writeln('Adding topping:');
end;

{ TNYStyleCheesePizza }

constructor TNYStyleCheesePizza.Create;
begin
FName  := 'NY Style Sauce and Cheese Pizza';
FDough := 'Thin Crust Dough';
FSauce := 'Marinara Sauce';
end;

{ TNYStyleClamPizza }

constructor TNYStyleClamPizza.Create;
begin
FName  := 'NY Style Clam Pizza';
FDough := 'Thin Crust Dough';
FSauce := 'Marinara Sauce';
end;

{ TNYStylePepperoniPizza }

constructor TNYStylePepperoniPizza.Create;
begin
FName  := 'NY Style Pepperoni Pizza';
FDough := 'Thin Crust Dough';
FSauce := 'Marinara Sauce';
end;

{ TNYStyleVeggieizza }

constructor TNYStyleVeggiePizza.Create;
begin
FName  := 'NY Style Veggie Pizza';
FDough := 'Thin Crust Dough';
FSauce := 'Marinara Sauce';
end;

{ TChicagoStyleCheesePizza }

constructor TChicagoStyleCheesePizza.Create;
begin
FName  := 'Chicago Style Deep Dish Cheese Pizza';
FDough := 'Extra Thick Crust Dough';
FSauce := 'Plum Tomato Sauce';
end;

procedure TChicagoStyleCheesePizza.Cut;
begin
Writeln('Cutting the pizza into square slices');
end;

{ TChicagoStyleClamPizza }

constructor TChicagoStyleClamPizza.Create;
begin
FName  := 'Chicago Style Clam Pizza';
FDough := 'Extra Thick Crust Dough';
FSauce := 'Plum Tomato Sauce';
end;

procedure TChicagoStyleClamPizza.Cut;
begin
Writeln('Cutting the pizza into square slices');
end;

{ TChicagoStylePepperoniPizza }

constructor TChicagoStylePepperoniPizza.Create;
begin
FName  := 'Chicago Style Pepperoni Pizza';
FDough := 'Extra Thick Crust Dough';
FSauce := 'Plum Tomato Sauce';
end;

procedure TChicagoStylePepperoniPizza.Cut;
begin
Writeln('Cutting the pizza into square slices');
end;

{ TChicagoStyleVeggiePizza }

constructor TChicagoStyleVeggiePizza.Create;
begin
FName  := 'Chicago Style Veggie Pizza';
FDough := 'Extra Thick Crust Dough';
FSauce := 'Plum Tomato Sauce';
end;

procedure TChicagoStyleVeggiePizza.Cut;
begin
Writeln('Cutting the pizza into square slices');
end;

end.


2.工厂类

{《HeadFirst设计模式》工厂模式之工厂方法 }
{ 工厂类                              }
{ 编译工具 :Delphi2007 for win32     }
{ 联系方式 :xshlife@163.com          }

unit uFactory;

interface

uses
uProducts;

type
TPizzaStore = class abstract(TObject)
strict protected
FPizza: TPizza;
public
function OrderPizza (Category: Integer): TPizza;
function CreatePizza(Category: Integer): TPizza; virtual; abstract;
end;

TNYPizzaStore = class(TPizzaStore)
public
function CreatePizza(Category: Integer): TPizza; override;
destructor Destroy; override;
end;

TChicagoPizzaStore = class(TPizzaStore)
public
function CreatePizza(Category: Integer): TPizza; override;
destructor Destroy; override;
end;

implementation

{ TPizzaStore }

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(Category: Integer): TPizza;
begin
case Category of
0: Result := TNYStyleCheesePizza.Create;
1: Result := TNYStyleClamPizza.Create;
2: Result := TNyStylePepperoniPizza.Create;
3: Result := TNYStyleVeggiePizza.Create;
else
Result := nil;
end;
end;

destructor TNYPizzaStore.Destroy;
begin
FPizza.Free;
inherited Destroy;
end;

{ TChicagoPizzaStore }

function TChicagoPizzaStore.CreatePizza(Category: Integer): TPizza;
begin
case Category of
0: Result := TChicagoStyleCheesePizza.Create;
1: Result := TChicagoStyleClamPizza.Create;
2: Result := TChicagoStylePepperoniPizza.Create;
3: Result := TChicagoStyleVeggiePizza.Create;
else
Result := nil;
end;
end;

destructor TChicagoPizzaStore.Destroy;
begin
FPizza.Free;
inherited Destroy;
end;

end.


3. 客户端

{《HeadFirst设计模式》工厂模式之工厂方法 }
{ 客户端                              }
{ 编译工具 :Delphi2007 for win32     }
{ 联系方式 :xshlife@163.com          }

program pPizzaStoreTest;

{$APPTYPE CONSOLE}

uses
uFactory in 'uFactory.pas',
uProducts in 'uProducts.pas';

var
aNYStore: TPizzaStore;
aChicagoStore: TPizzaStore;
aPizza: TPizza;

begin
aNYStore := TNYPizzaStore.Create;
aPizza := aNYStore.OrderPizza(0);
Writeln('Ethan ordered a ' + aPizza.Name);
aNYStore.Free;

Writeln;

aChicagoStore := TChicagoPizzaStore.Create;
aPizza := aChicagoStore.OrderPizza(0);
Writeln('Joel ordered a ' + aPizza.Name);
aChicagoStore.Free;

Readln;
end.


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐