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. 运行结果: