Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---工厂模式之工厂方法[转]
1
2{《HeadFirst设计模式》工厂模式之工厂方法 }
3{ 产品类 }
4{ 编译工具 :Delphi2007 for win32 }
5{ 联系方式 :guzh-0417@163.com }
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{ 联系方式 :guzh-0417@163.com }
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{ 联系方式 :guzh-0417@163.com }
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
运行结果:
Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---工厂模式之工厂方法[转]的更多相关文章
- Java设计模式之-----工厂模式(简单工厂,抽象工厂)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- Java设计模式之工厂模式(简单工厂模式+工厂方法模式)
摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录
1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客 ...
- iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)
1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式
1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...
- iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)
1. 简单工厂模式 怎样理解简单工厂,工厂方法. 抽象工厂三种设计模式? 简单工厂的生活场景.卖早点的小摊贩.他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂.它生产包子,馒头,地沟油烙的煎饼. ...
- C#设计模式——简单工厂模式、工厂模式和抽象工厂模式
一:简单工厂模式 1:描述:简单工厂模式是由一个工厂对象根据接收到的消息决定要创建哪一个类的对象事例. 2:优点:工厂类中有相关逻辑判断,可以根据需要动态创建相关的对象事例,而客户端只需要告诉工厂类创 ...
随机推荐
- 8种形式的Android Dialog使用举例
在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一 ...
- POJ-3255-Roadblocks POJ-Dijkstra+邻接表
今天写了这一题,一开始跑了两个Dijkstra,但是造成内存超限,所以现在在学习邻接表,打算明天用邻接表和优先队列写,目前还在学习中,所以题目啥也还没上传,先上传了今晚对于邻接表的理解(见上图),明天 ...
- 第十四篇:PL/SQL Developer Oracle配置和必知基础
1.一般在本地使用PL/SQL 第三方工具操作Oracle数据库,首先你的机器上得有oracle的客户端client,下一个就行了,很小2.首先找到你下载的oracle的客户端的包,找到tnsname ...
- Java中方法的定义与使用,以及对数组的初步了解。
方法 方法的含义 定义: 方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本,控制输入或计算数值. 我们可以通过在程序代码 ...
- Mysql之DQL------基础查询
#笔记内容来自于B站尚硅谷教学视频(av49181542)use myemployees; 查询表中的单个字段 SELECT last_name FROM employees; 查询表中的多个字段 # ...
- 面试系列12 redis和memcached有什么区别
(1)redis和memcached有啥区别 这个事儿吧,你可以比较出N多个区别来,但是我还是采取redis作者给出的几个比较吧 1)Redis支持服务器端的数据操作:Redis相比Memcached ...
- pywebview gui='cef' 生成app报错—— 中断点 已到达中断点
pywebview是一个轻量级跨平台包装器,允许在其自己的本机GUI窗口中显示HTML内容.它提供了桌面应用程序中Web技术的强大功能,隐藏了GUI基于浏览器的事实.这个玩意儿好啊,可以直接让我们做的 ...
- (转)Lua语言实现简单的多线程模型
转自: https://blog.csdn.net/john_crash/article/details/49489609 lua本身是不支持真正的多线程的,但是lua提供了相应的机制来实现多线程.l ...
- vc 获取窗口标题GetWindowText
今天在写一个模块,具体功能是想时刻监控用户当前活动窗口,需要获取窗口标题以及其它相关信息,记得API GetWindowText就是用来做这个的,结果试了半天,有的获取成功了有的获取失败了,而且有关汉 ...
- selenium学习笔记——driver.get(url) 页面加载时间太长
# 两个同时设置才行 # 实现效果:加载状态停止,进行代码下一步操作 driver.set_page_load_timeout(10) driver.set_script_timeout(10) # ...