这篇文章将完成以下内容:
1、代码用支持中文的 Delphi 2005 编译并通过,并去除了其中一些无关紧要的地方,如异常处理等 ;
2、重新设计一个情景,分别用“简单工厂模式”和“工厂方法模式”两种方法实现,请体会其中的差别 ;
3、在情景中添加一个子类后,请体会“简单工厂模式”和“工厂方法模式”两种方法不同的处理方式;
4、如果不理解什么是接口、多态、静态函数等概念,这里不作解释,请看第一章或找相关资料;
5、本文的情景和上文差不多,只是把工厂从“果园”变成了“水果小贩”;同样的三种水果:苹果、葡萄、草莓;每种水果都封装了两个逻辑,在和外部“交易”时会用到这两个逻辑。 最后,请重新回顾“开闭原则”
下面开始吧。
这里是简单工厂模式的实现方法,在这种模式中:
1、一个小贩要负责所有三种水果的交易,这对他来说是很大的挑战噢,不信您看!
2、顾客必须对水果的名字有一个准确地描述,这样水果才会卖给你,这很影响生意呀!
//简单工厂类和水果类单元文件
unit SimpleFactory;
interface
type
接口_水果 = interface(IInterface)
function 提示():string;
function 被评价():string;
end;
类_苹果 = class(TInterfacedObject, 接口_水果)
function 提示():string;
function 被评价():string;
end;
类_葡萄 = class(TInterfacedObject, 接口_水果)
function 提示():string;
function 被评价():string;
end;
类_草莓 = class(TInterfacedObject, 接口_水果)
function 提示():string;
function 被评价():string;
end;
工厂类_小贩 = class(TObject)
public
class function 工厂(水果名:string): 接口_水果;
end;
implementation
{***** 类_苹果 *****}
function 类_苹果.提示():string;
begin
result:=''削了皮再吃!'';
end;
function 类_苹果.被评价():string;
begin
result:=''恩,还不错,挺甜!'';
end;
{*****类_葡萄 *****}
function 类_葡萄.提示():string;
begin
result:=''别把核咽下去了!'';
end;
function 类_葡萄.被评价():string;
begin
result:=''没有核呀???'';
end;
{***** 类_草莓 *****}
function 类_草莓.提示():string;
begin
result:=''别怪我没告诉你,很酸!'';
end;
function 类_草莓.被评价():string;
begin
result:=''试试?哇,牙快酸掉了!'';
end;
{***** 工厂类_小贩 *****}
class function 工厂类_小贩.工厂(水果名:string): 接口_水果;
begin
if(水果名=''苹果'')then result:=类_苹果.Create()
else if(水果名=''葡萄'')then result:=类_葡萄.Create()
else if(水果名=''草莓'')then result:=类_草莓.Create();
end;
end.
//窗体单元文件
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,SimpleFactory;
type
TForm1 = class(TForm)
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
procedure RadioButton3Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
private
procedure 交易(水果名:string);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.交易(水果名:string);
var
我买的水果: 接口_水果;
begin
我买的水果:=工厂类_小贩.工厂(水果名);
ShowMessage(我买的水果.提示);
ShowMessage(我买的水果.被评价);
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
交易(''苹果'');
end;
procedure TForm1.RadioButton2Click(Se