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


  1
  2{《HeadFirst设计模式》工厂模式之工厂方法 }
  3{ 产品类                              }
  4{ 编译工具 :Delphi2007 for win32      }
  5{ 联系方式 :[email protected]         }
  6
  7unit uProducts;
  8
  9interface
 10
 11type
 12  { abstract Pizza }
 13
 14  TPizza = class abstract(TObject)
 15  strict private
 16    function GetName: string;
 17  strict protected
 18    FName : string;
 19    FDough: string;
 20    FSauce: string;
 21  public
 22    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  public
 33    constructor Create;
 34  end;
 35
 36  TNYStyleClamPizza = class(TPizza)
 37  public
 38    constructor Create;
 39  end;
 40
 41  TNYStylePepperoniPizza = class(TPizza)
 42  public
 43    constructor Create;
 44  end;
 45
 46  TNYStyleVeggiePizza = class(TPizza)
 47  public
 48    constructor Create;
 49  end;
 50
 51  { Chicago Style Pizza }
 52
 53  TChicagoStyleCheesePizza = class(TPizza)
 54  public
 55    constructor Create;
 56    procedure Cut; override;
 57  end;
 58
 59  TChicagoStyleClamPizza = class(TPizza)
 60  public
 61    constructor Create;
 62    procedure Cut; override;
 63  end;
 64
 65  TChicagoStylePepperoniPizza = class(TPizza)
 66  public
 67    constructor Create;
 68    procedure Cut; override;
 69  end;
 70
 71  TChicagoStyleVeggiePizza = class(TPizza)
 72  public
 73    constructor Create;
 74    procedure Cut; override;
 75  end;
 76
 77implementation
 78
 79{ TPizza }
 80
 81procedure TPizza.Bake;
 82begin
 83  Writeln(‘Bake for 25 minutes at 350‘);
 84end;
 85
 86procedure TPizza.Box;
 87begin
 88  Writeln(‘Place pizza in official PizzaStore box‘);
 89end;
 90
 91procedure TPizza.Cut;
 92begin
 93  Writeln(‘Cutting the pizza into diaginal slices‘);
 94end;
 95
 96function TPizza.GetName: string;
 97begin
 98  Result := FName;
 99end;
100
101procedure TPizza.Prepare;
102begin
103  Writeln(‘Preparing ‘ + FName);
104  Writeln(‘Tossing dough‘);
105  Writeln(‘Adding sauce‘);
106  Writeln(‘Adding topping:‘);
107end;
108
109{ TNYStyleCheesePizza }
110
111constructor TNYStyleCheesePizza.Create;
112begin
113  FName  := ‘NY Style Sauce and Cheese Pizza‘;
114  FDough := ‘Thin Crust Dough‘;
115  FSauce := ‘Marinara Sauce‘;
116end;
117
118{ TNYStyleClamPizza }
119
120constructor TNYStyleClamPizza.Create;
121begin
122  FName  := ‘NY Style Clam Pizza‘;
123  FDough := ‘Thin Crust Dough‘;
124  FSauce := ‘Marinara Sauce‘;
125end;
126
127{ TNYStylePepperoniPizza }
128
129constructor TNYStylePepperoniPizza.Create;
130begin
131  FName  := ‘NY Style Pepperoni Pizza‘;
132  FDough := ‘Thin Crust Dough‘;
133  FSauce := ‘Marinara Sauce‘;
134end;
135
136{ TNYStyleVeggieizza }
137
138constructor TNYStyleVeggiePizza.Create;
139begin
140  FName  := ‘NY Style Veggie Pizza‘;
141  FDough := ‘Thin Crust Dough‘;
142  FSauce := ‘Marinara Sauce‘;
143end;
144
145{ TChicagoStyleCheesePizza }
146
147constructor TChicagoStyleCheesePizza.Create;
148begin
149  FName  := ‘Chicago Style Deep Dish Cheese Pizza‘;
150  FDough := ‘Extra Thick Crust Dough‘;
151  FSauce := ‘Plum Tomato Sauce‘;
152end;
153
154procedure TChicagoStyleCheesePizza.Cut;
155begin
156  Writeln(‘Cutting the pizza into square slices‘);
157end;
158
159{ TChicagoStyleClamPizza }
160
161constructor TChicagoStyleClamPizza.Create;
162begin
163  FName  := ‘Chicago Style Clam Pizza‘;
164  FDough := ‘Extra Thick Crust Dough‘;
165  FSauce := ‘Plum Tomato Sauce‘;
166end;
167
168procedure TChicagoStyleClamPizza.Cut;
169begin
170  Writeln(‘Cutting the pizza into square slices‘);
171end;
172
173{ TChicagoStylePepperoniPizza }
174
175constructor TChicagoStylePepperoniPizza.Create;
176begin
177  FName  := ‘Chicago Style Pepperoni Pizza‘;
178  FDough := ‘Extra Thick Crust Dough‘;
179  FSauce := ‘Plum Tomato Sauce‘;
180end;
181
182procedure TChicagoStylePepperoniPizza.Cut;
183begin
184  Writeln(‘Cutting the pizza into square slices‘);
185end;
186
187{ TChicagoStyleVeggiePizza }
188
189constructor TChicagoStyleVeggiePizza.Create;
190begin
191  FName  := ‘Chicago Style Veggie Pizza‘;
192  FDough := ‘Extra Thick Crust Dough‘;
193  FSauce := ‘Plum Tomato Sauce‘;
194end;
195
196procedure TChicagoStyleVeggiePizza.Cut;
197begin
198  Writeln(‘Cutting the pizza into square slices‘);
199end;
200
201end.
202


 1
 2{《HeadFirst设计模式》工厂模式之工厂方法 }
 3{ 工厂类                              }
 4{ 编译工具 :Delphi2007 for win32     }
 5{ 联系方式 :[email protected]        }
 6
 7unit uFactory;
 8
 9interface
10
11uses
12  uProducts;
13
14type
15  TPizzaStore = class abstract(TObject)
16  strict protected
17    FPizza: TPizza;
18  public
19    function OrderPizza (Category: Integer): TPizza;
20    function CreatePizza(Category: Integer): TPizza; virtual; abstract;
21  end;
22
23  TNYPizzaStore = class(TPizzaStore)
24  public
25    function CreatePizza(Category: Integer): TPizza; override;
26    destructor Destroy; override;
27  end;
28
29  TChicagoPizzaStore = class(TPizzaStore)
30  public
31    function CreatePizza(Category: Integer): TPizza; override;
32    destructor Destroy; override;
33  end;
34
35implementation
36
37{ TPizzaStore }
38
39function TPizzaStore.OrderPizza(Category: Integer): TPizza;
40begin
41  FPizza := CreatePizza(Category);
42  
43  FPizza.Prepare;
44  FPizza.Bake;
45  FPizza.Cut;
46  FPizza.Box;
47
48  Result := FPizza;
49end;
50
51{ TNYPizzaStore }
52
53function TNYPizzaStore.CreatePizza(Category: Integer): TPizza;
54begin
55  case Category of
56    0: Result := TNYStyleCheesePizza.Create;
57    1: Result := TNYStyleClamPizza.Create;
58    2: Result := TNyStylePepperoniPizza.Create;
59    3: Result := TNYStyleVeggiePizza.Create;
60  else
61    Result := nil;
62  end;
63end;
64
65destructor TNYPizzaStore.Destroy;
66begin
67  FPizza.Free;
68  inherited Destroy;
69end;
70
71{ TChicagoPizzaStore }
72
73function TChicagoPizzaStore.CreatePizza(Category: Integer): TPizza;
74begin
75  case Category of
76    0: Result := TChicagoStyleCheesePizza.Create;
77    1: Result := TChicagoStyleClamPizza.Create;
78    2: Result := TChicagoStylePepperoniPizza.Create;
79    3: Result := TChicagoStyleVeggiePizza.Create;
80  else
81    Result := nil;
82  end;
83end;
84
85destructor TChicagoPizzaStore.Destroy;
86begin
87  FPizza.Free;
88  inherited Destroy;
89end;
90
91end.
92


 1
 2{《HeadFirst设计模式》工厂模式之工厂方法 }
 3{ 客户端                              }
 4{ 编译工具 :Delphi2007 for win32     }
 5{ 联系方式 :[email protected]        }
 6
 7program pPizzaStoreTest;
 8
 9{$APPTYPE CONSOLE}
10
11uses
12  uFactory in ‘uFactory.pas‘,
13  uProducts in ‘uProducts.pas‘;
14
15var
16  aNYStore: TPizzaStore;
17  aChicagoStore: TPizzaStore;
18  aPizza: TPizza;
19
20begin
21  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;
34end.
35

运行结果:

时间: 2024-10-11 07:55:13

Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---工厂模式之工厂方法[转]的相关文章

研磨设计模式解析及python代码实现——(一)简单工厂模式

最近在学设计模式,正巧书之前学了些python,但用的还不是很成熟.<研磨设计模式>书上只给了java代码,本着以练手为目标,我照着书上打了一遍java代码,在仔细体会其思想后,将其写成了python的代码.有不对的地方希望各位批评指正~ 具体原理不多做介绍,具体可以参考http://chjavach.iteye.com的博客,或者<研磨设计模式>的书. 一.背景介绍 接口思想: 众所周知,面向对象语言最大的特点便是封装,继承,多态这三个概念.而像Java等面向对象语言最核心的思想

工厂模式&amp;抽象工厂——HeadFirst设计模式学习笔记

当使用new实例化一个类时,使用的是实现,而不是接口,代码捆绑着具体类会导致代码更脆弱缺乏弹性,使用松耦合的OO模式可以得到解脱. 工厂:封装对象的创建,处理创建对象的细节 静态工厂:利用静态方法定义一个简单的工厂.优点:不需要创建工厂类的实例化.缺点:不能通过继承改变创建方法行为. 简单工厂:简单工厂并不是一种设计模式,因为只是简单的把创建对象的代码封装起来 工厂模式:在父类定义了一个创建对象的接口,通过让子类决定创建的对象是什么,来达到让对象创建的过程封装的目的.工厂方法让类把实例化推迟到子

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博文,并不是像一些"非主流"的爱情观那样"宁缺毋滥". 只是其一呢,因为相当于给自己做一个总结,加深一下自己这方面的认识,因为掌握了和把它写出来我感觉后者还可以对技能有一个提升,其二呢是因为最近公司有一个内部的training需要讲设计模式. v写在前面 在这里呢,需要向

设计模式- 简单工厂模式、工厂方法模式及其比较

简单工厂模式及实例 前言工大有许多同学是做java的,大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式,其中工厂模式就是最常用的模式之一.下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家.由于笔者能力限制,在实践中也没参与过什么大的项目,笔者参与过的项目用到的工厂模式主要是简单工厂模式(Simple Factory)和工厂方法模式(Factory Method),所以笔者在本文主要介绍的是这两种模式.准备知识在OO设计领域,我们知道

iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下所示: 代码结构如下 Animal 类 @interface Animal :NSObject @proterty(nonatomic,strong) NSString *name; -(void)laugh; @end Dog类 @interface Dog:Animal @end Cat类 @i

设计模式---(简单工厂模式,工厂模式,抽象工程模式),单例模式,代理模式,装饰器

简单工厂模式    简单工厂模式并不属于GoF的23种设计模式.     那么为什么我要用工厂模式呢?请看下面的一段程序.  #include  <iostream> using  namespace  std; class  Fruit  { public:     Fruit(string  name)  {         this-­‐>name  =  name;         if  (name  ==  "apple")  {      

iOS设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂的生活场景,卖早点的小摊贩,他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂,它生产包子,馒头,地沟油烙的煎饼.该场景对应的UML图如下所示: 图1:简单工厂模式UML图 简单工厂模式的参与者: 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象. 抽象产品(Abstract Product)角色: 是工厂模式所创建对象的父类或是共同拥有的接口.可是抽象类或接口. 具体产品(Conc

简单工厂模式、工厂方法模式和抽象工厂模式-设计模式学习

1.简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象. 抽象产品(Product)角色 简单工厂模式所创建的所有