1

2
{《HeadFirst设计模式》工厂模式之工厂方法 }3
{ 产品类 }4
{ 编译工具 :Delphi2007 for win32 }5
{ 联系方式 :guzh-0417@163.com }6

7
unit uProducts;8

9
interface10

11
type12
{ abstract Pizza }13

14
TPizza = class abstract(TObject)15
strict private16
function GetName: string;17
strict protected18
FName : string;19
FDough: string;20
FSauce: string;21
public22
procedure Prepare;23
procedure Bake;24
procedure Cut; virtual;25
procedure Box; 26
property Name: string read GetName;27
end;28

29
{ NY Style Pizza }30

31
TNYStyleCheesePizza = class(TPizza)32
public33
constructor Create;34
end;35

36
TNYStyleClamPizza = class(TPizza)37
public38
constructor Create;39
end;40

41
TNYStylePepperoniPizza = class(TPizza)42
public43
constructor Create;44
end;45

46
TNYStyleVeggiePizza = class(TPizza)47
public48
constructor Create;49
end;50

51
{ Chicago Style Pizza }52

53
TChicagoStyleCheesePizza = class(TPizza)54
public55
constructor Create;56
procedure Cut; override;57
end;58

59
TChicagoStyleClamPizza = class(TPizza)60
public61
constructor Create;62
procedure Cut; override;63
end;64

65
TChicagoStylePepperoniPizza = class(TPizza)66
public67
constructor Create;68
procedure Cut; override;69
end;70

71
TChicagoStyleVeggiePizza = class(TPizza)72
public73
constructor Create;74
procedure Cut; override;75
end;76

77
implementation78

79
{ TPizza }80

81
procedure TPizza.Bake;82
begin83
Writeln('Bake for 25 minutes at 350');84
end;85

86
procedure TPizza.Box;87
begin88
Writeln('Place pizza in official PizzaStore box');89
end;90

91
procedure TPizza.Cut;92
begin93
Writeln('Cutting the pizza into diaginal slices');94
end;95

96
function TPizza.GetName: string;97
begin98
Result := FName;99
end;100

101
procedure TPizza.Prepare;102
begin103
Writeln('Preparing ' + FName);104
Writeln('Tossing dough
');105
Writeln('Adding sauce
');106
Writeln('Adding topping:');107
end;108

109
{ TNYStyleCheesePizza }110

111
constructor TNYStyleCheesePizza.Create;112
begin113
FName := 'NY Style Sauce and Cheese Pizza';114
FDough := 'Thin Crust Dough';115
FSauce := 'Marinara Sauce';116
end;117

118
{ TNYStyleClamPizza }119

120
constructor TNYStyleClamPizza.Create;121
begin122
FName := 'NY Style Clam Pizza';123
FDough := 'Thin Crust Dough';124
FSauce := 'Marinara Sauce';125
end;126

127
{ TNYStylePepperoniPizza }128

129
constructor TNYStylePepperoniPizza.Create;130
begin131
FName := 'NY Style Pepperoni Pizza';132
FDough := 'Thin Crust Dough';133
FSauce := 'Marinara Sauce';134
end;135

136
{ TNYStyleVeggieizza }137

138
constructor TNYStyleVeggiePizza.Create;139
begin140
FName := 'NY Style Veggie Pizza';141
FDough := 'Thin Crust Dough';142
FSauce := 'Marinara Sauce';143
end;144

145
{ TChicagoStyleCheesePizza }146

147
constructor TChicagoStyleCheesePizza.Create;148
begin149
FName := 'Chicago Style Deep Dish Cheese Pizza';150
FDough := 'Extra Thick Crust Dough';151
FSauce := 'Plum Tomato Sauce';152
end;153

154
procedure TChicagoStyleCheesePizza.Cut;155
begin156
Writeln('Cutting the pizza into square slices');157
end;158

159
{ TChicagoStyleClamPizza }160

161
constructor TChicagoStyleClamPizza.Create;162
begin163
FName := 'Chicago Style Clam Pizza';164
FDough := 'Extra Thick Crust Dough';165
FSauce := 'Plum Tomato Sauce';166
end;167

168
procedure TChicagoStyleClamPizza.Cut;169
begin170
Writeln('Cutting the pizza into square slices');171
end;172

173
{ TChicagoStylePepperoniPizza }174

175
constructor TChicagoStylePepperoniPizza.Create;176
begin177
FName := 'Chicago Style Pepperoni Pizza';178
FDough := 'Extra Thick Crust Dough';179
FSauce := 'Plum Tomato Sauce';180
end;181

182
procedure TChicagoStylePepperoniPizza.Cut;183
begin184
Writeln('Cutting the pizza into square slices');185
end;186

187
{ TChicagoStyleVeggiePizza }188

189
constructor TChicagoStyleVeggiePizza.Create;190
begin191
FName := 'Chicago Style Veggie Pizza';192
FDough := 'Extra Thick Crust Dough';193
FSauce := 'Plum Tomato Sauce';194
end;195

196
procedure TChicagoStyleVeggiePizza.Cut;197
begin198
Writeln('Cutting the pizza into square slices');199
end;200

201
end.202

1

2
{《HeadFirst设计模式》工厂模式之工厂方法 }3
{ 工厂类 }4
{ 编译工具 :Delphi2007 for win32 }5
{ 联系方式 :guzh-0417@163.com }6

7
unit uFactory;8

9
interface10

11
uses12
uProducts;13

14
type15
TPizzaStore = class abstract(TObject)16
strict protected17
FPizza: TPizza;18
public19
function OrderPizza (Category: Integer): TPizza;20
function CreatePizza(Category: Integer): TPizza; virtual; abstract;21
end;22

23
TNYPizzaStore = class(TPizzaStore)24
public25
function CreatePizza(Category: Integer): TPizza; override;26
destructor Destroy; override;27
end;28

29
TChicagoPizzaStore = class(TPizzaStore)30
public31
function CreatePizza(Category: Integer): TPizza; override;32
destructor Destroy; override;33
end;34

35
implementation36

37
{ TPizzaStore }38

39
function TPizzaStore.OrderPizza(Category: Integer): TPizza;40
begin41
FPizza := CreatePizza(Category);42
43
FPizza.Prepare;44
FPizza.Bake;45
FPizza.Cut;46
FPizza.Box;47

48
Result := FPizza;49
end;50

51
{ TNYPizzaStore }52

53
function TNYPizzaStore.CreatePizza(Category: Integer): TPizza;54
begin55
case Category of56
0: Result := TNYStyleCheesePizza.Create;57
1: Result := TNYStyleClamPizza.Create;58
2: Result := TNyStylePepperoniPizza.Create;59
3: Result := TNYStyleVeggiePizza.Create;60
else61
Result := nil;62
end;63
end;64

65
destructor TNYPizzaStore.Destroy;66
begin67
FPizza.Free;68
inherited Destroy;69
end;70

71
{ TChicagoPizzaStore }72

73
function TChicagoPizzaStore.CreatePizza(Category: Integer): TPizza;74
begin75
case Category of76
0: Result := TChicagoStyleCheesePizza.Create;77
1: Result := TChicagoStyleClamPizza.Create;78
2: Result := TChicagoStylePepperoniPizza.Create;79
3: Result := TChicagoStyleVeggiePizza.Create;80
else81
Result := nil;82
end;83
end;84

85
destructor TChicagoPizzaStore.Destroy;86
begin87
FPizza.Free;88
inherited Destroy;89
end;90

91
end.92

1

2
{《HeadFirst设计模式》工厂模式之工厂方法 }3
{ 客户端 }4
{ 编译工具 :Delphi2007 for win32 }5
{ 联系方式 :guzh-0417@163.com }6

7
program pPizzaStoreTest;8

9
{$APPTYPE CONSOLE}10

11
uses12
uFactory in 'uFactory.pas',13
uProducts in 'uProducts.pas';14

15
var16
aNYStore: TPizzaStore;17
aChicagoStore: TPizzaStore;18
aPizza: TPizza;19

20
begin21
aNYStore := TNYPizzaStore.Create;22
aPizza := aNYStore.OrderPizza(0);23
Writeln('Ethan ordered a ' + aPizza.Name);24
aNYStore.Free;25

26
Writeln;27

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

33
Readln;34
end.35

运行结果:
浙公网安备 33010602011771号