1

2
{《HeadFirst设计模式》工厂模式之抽象工厂 }3
{ 抽象工厂的产品 }4
{ 编译工具:Delphi7.0 }5
{ E-Mail :guzh-0417@163.com }6

7
unit uPizzaIngredient;8

9
interface10

11
type12
TDough = class(TObject)13
end;14

15
TThinCrustDough = class(TDough)16
end;17

18
TThickCrustDough = class(TDough)19
end;20

21
////////////////////////////////22

23
TSauce = class(TObject)24
end;25

26
TMarinaraSauce = class(TSauce)27
end;28

29
TPlumTomatoSauce = class(TSauce)30
end;31

32
////////////////////////////////33

34
TCheese = class(TObject)35
end;36

37
TReggianoCheese = class(TCheese)38
end;39

40
TMozzarellaCheese = class(TCheese)41
end;42

43
//////////////////////////////////44

45
TPepperoni = class(TObject)46
end;47

48
TSlicedPepperoni = class(TPepperoni)49
end;50

51
////////////////////////////////////52
53
TClams = class(TObject)54
end;55

56
TFreshClams = class(TClams)57
end;58

59
TFrozenClams = class(TClams)60
end;61

62
implementation63

64
end.1

2
{《HeadFirst设计模式》工厂模式之抽象工厂 }3
{ 抽象工厂 }4
{ 编译工具:Delphi7.0 }5
{ E-Mail :guzh-0417@163.com }6

7
unit uPizzaIngredientFactory;8

9
interface10

11
uses12
uPizzaIngredient;13

14
type15
TPizzaIngredientFactory = class(TObject)16
public17
function CreateDough: TDough; virtual; abstract;18
function CreateSauce: TSauce; virtual; abstract;19
function CreateCheese: TCheese; virtual; abstract;20
function CreatePepperoni: TPepperoni; virtual; abstract;21
function CreateClams: TClams; virtual; abstract;22
end;23

24
TNYPizzaIngredientFactory = class(TPizzaIngredientFactory)25
public26
function CreateDough: TDough; override;27
function CreateSauce: TSauce; override;28
function CreateCheese: TCheese; override;29
function CreatePepperoni: TPepperoni; override;30
function CreateClams: TClams; override;31
end;32

33
TChicagoPizzaIngredientFactory = class(TPizzaIngredientFactory)34
public35
function CreateDough: TDough; override;36
function CreateSauce: TSauce; override;37
function CreateCheese: TCheese; override;38
function CreatePepperoni: TPepperoni; override;39
function CreateClams: TClams; override;40
end;41

42
implementation43

44
{ TNYPizzaIngredientFactory }45

46
function TNYPizzaIngredientFactory.CreateCheese: TCheese;47
begin48
Result := TReggianoCheese.Create;49
end;50

51
function TNYPizzaIngredientFactory.CreateClams: TClams;52
begin53
Result := TFreshClams.Create;54
end;55

56
function TNYPizzaIngredientFactory.CreateDough: TDough;57
begin58
Result := TThinCrustDough.Create;59
end;60

61
function TNYPizzaIngredientFactory.CreatePepperoni: TPepperoni;62
begin63
Result := TSlicedPepperoni.Create;64
end;65

66
function TNYPizzaIngredientFactory.CreateSauce: TSauce;67
begin68
Result := TMarinaraSauce.Create;69
end;70

71
{ TChicagoPizzaIngredientFactory }72

73
function TChicagoPizzaIngredientFactory.CreateCheese: TCheese;74
begin75
Result := TMozzarellaCheese.Create;76
end;77

78
function TChicagoPizzaIngredientFactory.CreateClams: TClams;79
begin80
Result := TFrozenClams.Create;81
end;82

83
function TChicagoPizzaIngredientFactory.CreateDough: TDough;84
begin85
Result := TThickCrustDough.Create;86
end;87

88
function TChicagoPizzaIngredientFactory.CreatePepperoni: TPepperoni;89
begin90
Result := TSlicedPepperoni.Create;91
end;92

93
function TChicagoPizzaIngredientFactory.CreateSauce: TSauce;94
begin95
Result := TPlumTomatoSauce.Create;96
end;97

98
end.1

2
{《HeadFirst设计模式》工厂模式之抽象工厂 }3
{ 抽象工厂的用户 }4
{ 编译工具:Delphi7.0 }5
{ E-Mail :guzh-0417@163.com }6

7
unit uPizza;8

9
interface10

11
uses12
uPizzaIngredient, uPizzaIngredientFactory;13

14
type15
TPizza = class(TObject)16
private17
procedure SetName(const Value: string);18
protected19
FName: string;20
FDough: TDough;21
FSauce: TSauce;22
FCheese: TCheese;23
FPepperoni: TPepperoni;24
FClams: TClams;25
FIngredientFactory: TPizzaIngredientFactory;26
public27
constructor Create(aIngredientFactory: TPizzaIngredientFactory);28
procedure Prepare; virtual; abstract;29
procedure Bake;30
procedure Cut;31
procedure Box;32
property Name: string read FName write SetName;33
end;34

35
TCheesePizza = class(TPizza)36
public37
destructor Destroy; override;38
procedure Prepare; override;39
end;40

41
TClamsPizza = class(TPizza)42
public43
destructor Destroy; override;44
procedure Prepare; override;45
end;46
47
implementation48

49
{ TPizza }50

51
procedure TPizza.Bake;52
begin53
Writeln('Bake for 25 minutes at 350');54
end;55

56
procedure TPizza.Box;57
begin58
Writeln('Place pizza in official PizzaStore box');59
end;60

61
constructor TPizza.Create(aIngredientFactory: TPizzaIngredientFactory);62
begin63
Self.FIngredientFactory := aIngredientFactory;64
end;65

66
procedure TPizza.Cut;67
begin68
Writeln('Cutting the pizza into diagonal slices');69
end;70

71
procedure TPizza.SetName(const Value: string);72
begin73
FName := Value;74
end;75

76
{ TCheesePizza }77

78
destructor TCheesePizza.Destroy;79
begin80
FDough.Free;81
FSauce.Free;82
FCheese.Free;83
inherited;84
end;85

86
procedure TCheesePizza.Prepare;87
begin88
Writeln('Preparing ' + Name);89
FDough := FIngredientFactory.CreateDough;90
FSauce := FIngredientFactory.CreateSauce;91
FCheese := FIngredientFactory.CreateCheese;92
end;93

94
{ TClamsPizza }95

96
destructor TClamsPizza.Destroy;97
begin98
FDough.Free;99
FSauce.Free;100
FCheese.Free;101
FClams.Free;102
inherited;103
end;104

105
procedure TClamsPizza.Prepare;106
begin107
Writeln('Preparing ' + Name);108
FDough := FIngredientFactory.CreateDough;109
FSauce := FIngredientFactory.CreateSauce;110
FCheese := FIngredientFactory.CreateCheese;111
FClams := FIngredientFactory.CreateClams;112
end;113

114
end.1

2
{《HeadFirst设计模式》工厂模式之抽象工厂 }3
{ Pizza的用户 }4
{ 编译工具:Delphi7.0 }5
{ E-Mail :guzh-0417@163.com }6

7
unit uPizzaStore;8

9
interface10

11
uses12
uPizza, uPizzaIngredientFactory;13

14
type15
TPizzaStore = class(TObject)16
protected17
FPizza: TPizza;18
FIngredientFactory: TPizzaIngredientFactory;19
public20
destructor Destroy; override;21
function OrderPizza(Category: Integer): TPizza;22
function CreatePizza(Style: Integer): TPizza; virtual; abstract;23
end;24

25
TNYPizzaStore = class(TPizzaStore)26
public27
function CreatePizza(Style: Integer): TPizza; override;28
end;29

30
TChicagoPizzaStore = class(TPizzaStore)31
public32
function CreatePizza(Style: Integer): TPizza; override;33
end;34

35
implementation36

37
{ TPizzaStore }38

39
destructor TPizzaStore.Destroy;40
begin41
FPizza.Free;42
FIngredientFactory.Free;43
inherited;44
end;45

46
function TPizzaStore.OrderPizza(Category: Integer): TPizza;47
begin48
FPizza := CreatePizza(Category);49
FPizza.Prepare;50
FPizza.Bake;51
FPizza.Cut;52
FPizza.Box;53

54
Result := FPizza;55
end;56

57
{ TNYPizzaStore }58

59
function TNYPizzaStore.CreatePizza(Style: Integer): TPizza;60
begin61
FIngredientFactory := TNYPizzaIngredientFactory.Create;62
FPizza := nil;63
case Style of64
0: begin65
FPizza := TCheesePizza.Create(FIngredientFactory);66
FPizza.Name := 'New York Style Cheese Pizza';67
end;68
1: begin69
FPizza := TClamsPizza.Create(FIngredientFactory);70
FPizza.Name := 'New York Style Clams Pizza';71
end;72
//2: 其它风味的 New York Pizza73
//
74
end;75
Result := FPizza;76
end;77

78
{ TChicagoPizzaStore }79

80
function TChicagoPizzaStore.CreatePizza(Style: Integer): TPizza;81
begin82
FIngredientFactory := TChicagoPizzaIngredientFactory.Create;83
case Style of84
0: begin85
Result := TCheesePizza.Create(FIngredientFactory);86
Result.Name := 'Chicago Style Cheese Pizza';87
end;88
1: begin89
Result := TClamsPizza.Create(FIngredientFactory);90
Result.Name := 'Chicago Style Clams Pizza';91
end;92
//2: 其它风味的 Chicago Pizza93
//
94
else95
Result := nil;96
end;97
end;98

99
end.1

2
{《HeadFirst设计模式》工厂模式之抽象工厂 }3
{ 客户端 }4
{ 编译工具:Delphi7.0 }5
{ E-Mail :guzh-0417@163.com }6

7
program pPizzaStore;8

9
{$APPTYPE CONSOLE}10

11
uses12
uPizzaIngredient in 'uPizzaIngredient.pas',13
uPizzaIngredientFactory in 'uPizzaIngredientFactory.pas',14
uPizza in 'uPizza.pas',15
uPizzaStore in 'uPizzaStore.pas';16

17
var18
PizzaStore: TPizzaStore;19
Pizza: TPizza;20
21
begin22
PizzaStore := TNYPizzaStore.Create;23
Pizza := PizzaStore.OrderPizza(0);24
Writeln('Ethan ordered a ' + Pizza.Name);25
Writeln;26
Pizza := PizzaStore.OrderPizza(1);27
Writeln('Ethan ordered a ' + Pizza.Name);28
PizzaStore.Free;29
30
Writeln;31
Writeln(' ********************************** ');32
Writeln;33

34
PizzaStore := TChicagoPizzaStore.Create;35
Pizza := PizzaStore.OrderPizza(0);36
Writeln('Joel ordered a ' + Pizza.Name);37
Writeln;38
Pizza := PizzaStore.OrderPizza(1);39
Writeln('Joel ordered a ' + Pizza.Name);40
PizzaStore.Free;41

42
Readln;43
end.运行结果:
浙公网安备 33010602011771号