其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

用Delphi2005学设计模式之工厂方法篇


发布日期:2023年05月03日
 
用Delphi2005学设计模式之工厂方法篇
本文完成以下内容

代码用支持中文的 Delphi 编译并通过并去除了其中一些无关紧要的地方如异常处理等

重新设计一个情景分别用简单工厂模式工厂方法模式两种方法实现请体会其中的差别

在情景中添加一个子类后请体会简单工厂模式工厂方法模式两种方法不同的处理方式

如果不理解什么是接口多态静态函数等概念这里不作解释请看第一章或找相关资料

本文的情景和上文差不多只是把工厂从果园变成了水果小贩同样的三种水果苹果葡萄草莓每种水果都封装了两个逻辑在和外部交易时会用到这两个逻辑 最后请重新回顾开闭原则

下面开始吧

这里是简单工厂模式的实现方法在这种模式中

一个小贩要负责所有三种水果的交易这对他来说是很大的挑战噢不信您看!

顾客必须对水果的名字有一个准确地描述这样水果才会卖给你这很影响生意呀!

//简单工厂类和水果类单元文件

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 StdCtrlsSimpleFactory;

type

TForm = class(TForm)

RadioButton: TRadioButton;

RadioButton: TRadioButton;

RadioButton: TRadioButton;

procedure RadioButtonClick(Sender: TObject);

procedure RadioButtonClick(Sender: TObject);

procedure RadioButtonClick(Sender: TObject);

private

procedure 交易(水果名:string);

end;

var

Form: TForm;

implementation

{$R *dfm}

procedure TForm交易(水果名:string);

var

我买的水果: 接口_水果;

begin

我买的水果:=工厂类_小贩工厂(水果名);

ShowMessage(我买的水果提示);

ShowMessage(我买的水果被评价);

end;

procedure TFormRadioButtonClick(Sender: TObject);

begin

交易(苹果);

end;

procedure TFormRadioButtonClick(Sender: TObject);

begin

交易(葡萄);

end;

procedure TFormRadioButtonClick(Sender: TObject);

begin

交易(草莓);

end;

end

这里是工厂方法模式的实现方法在这种模式中

每一种水果都对应有一个小贩负责这样他们做起生意来就轻松多了呵呵!

顾客直接和小贩打交道他知道您要什么这样就不会因为说不清那讨厌的水果名字而吃不上说水果了

//工厂类和水果类单元文件

unit FactoryMethod;

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;

接口_小贩 = interface(IInterface)

function 工厂(): 接口_水果;

end;

类_苹果小贩 = class(TInterfacedObject 接口_小贩)

function 工厂(): 接口_水果;

end;

类_葡萄小贩 = class(TInterfacedObject 接口_小贩)

function 工厂(): 接口_水果;

end;

类_草莓小贩 = class(TInterfacedObject 接口_小贩)

function 工厂(): 接口_水果;

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;

{***** 类_苹果小贩 *****}

function 类_苹果小贩工厂(): 接口_水果;

begin

result:=类_苹果Create()

end;

{***** 类_葡萄小贩 *****}

function 类_葡萄小贩工厂(): 接口_水果;

begin

result:=类_葡萄Create()

end;

{***** 类_草莓小贩 *****}

function 类_草莓小贩工厂(): 接口_水果;

begin

result:=类_草莓Create()

end;

end

//窗体单元文件

unit MainForm;

interface

uses

Windows Messages SysUtils Variants Classes Graphics Controls Forms

Dialogs StdCtrlsFactoryMethod;

type

TForm = class(TForm)

RadioButton: TRadioButton;

RadioButton: TRadioButton;

RadioButton: TRadioButton;

procedure RadioButtonClick(Sender: TObject);

procedure RadioButtonClick(Sender: TObject);

procedure RadioButtonClick(Sender: TObject);

private

procedure 交易(小贩:接口_小贩);

end;

var

Form: TForm;

implementation

{$R *dfm}

procedure TForm交易(小贩:接口_小贩);

var

我买的水果:接口_水果;

begin

我买的水果:=小贩工厂();

ShowMessage(我买的水果提示);

ShowMessage(我买的水果被评价);

end;

procedure TFormRadioButtonClick(Sender: TObject);

begin

交易(类_苹果小贩Create);

end;

procedure TFormRadioButtonClick(Sender: TObject);

begin

交易(类_葡萄小贩Create);

end;

procedure TFormRadioButtonClick(Sender: TObject);

begin

上一篇:DELPHI中使用API函数的方法

下一篇:Delphi学堂之在Delphi中自己建立交叉表