本文完成以下内容
代码用支持中文的 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
交