《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:用户界面工具包
2010-08-27 18:08
477 查看
示例:用户界面工具包
特点:
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
实现:
考虑一个支持多种视感(look-and-feel)标准的用户界面工具包,例如Motif和PresentationManager。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。
为解决这一问题我们可以定义一个抽象的WidgetFactory类,这个类声明了一个用来创建每一类基本窗口组件的接口。每一类窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定视感风格。对于每一个抽象窗口组件类,WidgetFactory接口都有一个返回新窗口组件对象的操作。客户调用这些操作以获得窗口组件实例,但客户并不知道他们正在使用的是哪些具体类。这样客户就不依赖于一般的视感风格,如下页图所示。
每一种视感标准都对应于一个具体的WidgetFactory子类。每一子类实现那些用于创建合适视感风格的窗口组件的操作。例如,MotifWidgetFactory的CreateScrollBar操作实例化并返回一个Motif滚动条,而相应的PMWidgetFactory操作返回一个Presentation Manager的滚动条。
客户通过WidgetFactory接口创建窗口组件,他们并不知道哪些类实现了特定视感风格的窗口组件。换言之,客户仅与抽象类定义的接口交互,而不使用特定的具体类的接口。
WidgetFactory也增强了具体窗口组件类之间依赖关系。一个Motif的滚动条应该与Motif按钮、Motif正文编辑器一起使用,这一约束条件作为使用MotifWidgetFactory的结果被自动加上。
注意:
(1)、使用端只是调用WidgetFactory的接口方法来产生需要的组件而不须去理会到底是由哪一个具体类所实现的。
(2)、每一个WidgetFactory子类分别实现其建立组件的操作。
(3)、WidgetFactory同时强调接口方法创建的具体类之间的相依性,不同的WidgetFactory子类所产生的实例对象不得共享。
(4)、我们仅需转换到相应的工厂对象,就可实现从Motif窗口组件转换为PresentationManager窗口组件。
代码:
unit uWidgetFactory;
interface
uses
Dialogs;
type
TScrollBar = class
public
procedure Show; virtual; abstract;
end;
TWindow = class
public
procedure Show; virtual; abstract;
end;
TMotifScrollBar = class(TScrollBar)
public
procedure Show; override;
end;
TMotifWindow = class(TWindow)
public
procedure Show; override;
end;
TPMScrollBar = class(TScrollBar)
public
procedure Show; override;
end;
TPMWindow = class(TWindow)
public
procedure Show; override;
end;
TWidgetFactory = class
public
function CreateWindow: TWindow; virtual; abstract;
function CreateScrollBar: TScrollBar; virtual; abstract;
end;
TMotifWidgetFactory = class(TWidgetFactory)
public
function CreateWindow: TWindow; override;
function CreateScrollBar: TScrollBar; override;
end;
TPMWidgetFactory = class(TWidgetFactory)
public
function CreateWindow: TWindow; override;
function CreateScrollBar: TScrollBar; override;
end;
implementation
function TMotifWidgetFactory.CreateWindow: TWindow;
begin
Result := TMotifWindow.Create;
end;
function TMotifWidgetFactory.CreateScrollBar: TScrollBar;
begin
Result := TMotifScrollBar.Create;
end;
function TPMWidgetFactory.CreateWindow: TWindow;
begin
Result := TPMWindow.Create;
end;
function TPMWidgetFactory.CreateScrollBar: TScrollBar;
begin
Result := TPMScrollBar.Create;
end;
procedure TMotifScrollBar.Show;
begin
showmessage('这是一个Motif的滚动条');
end;
procedure TPMScrollBar.Show;
begin
showmessage('这是一个Presentation Manager的滚动条');
end;
procedure TMotifWindow.Show;
begin
showmessage('这是一个Motif的窗口');
end;
procedure TPMWindow.Show;
begin
showmessage('这是一个Presentation Manager的窗口');
end;
end.
procedure TForm2.Button1Click(Sender: TObject);
var
AFactory: TWidgetFactory;
AWindow: TWindow;
AScrollBar: TScrollBar;
begin
//AFactory := TMotifWidgetFactory.Create;
AFactory := TPMWidgetFactory.Create;
AWindow := AFactory.CreateWindow;
AScrollBar := AFactory.CreateScrollBar;
//---
AWindow.Show;
AScrollBar.Show;
//---
AWindow.Free;
AScrollBar.Free;
AFactory.Free;
end;
特点:
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
实现:
考虑一个支持多种视感(look-and-feel)标准的用户界面工具包,例如Motif和PresentationManager。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。
为解决这一问题我们可以定义一个抽象的WidgetFactory类,这个类声明了一个用来创建每一类基本窗口组件的接口。每一类窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定视感风格。对于每一个抽象窗口组件类,WidgetFactory接口都有一个返回新窗口组件对象的操作。客户调用这些操作以获得窗口组件实例,但客户并不知道他们正在使用的是哪些具体类。这样客户就不依赖于一般的视感风格,如下页图所示。
每一种视感标准都对应于一个具体的WidgetFactory子类。每一子类实现那些用于创建合适视感风格的窗口组件的操作。例如,MotifWidgetFactory的CreateScrollBar操作实例化并返回一个Motif滚动条,而相应的PMWidgetFactory操作返回一个Presentation Manager的滚动条。
客户通过WidgetFactory接口创建窗口组件,他们并不知道哪些类实现了特定视感风格的窗口组件。换言之,客户仅与抽象类定义的接口交互,而不使用特定的具体类的接口。
WidgetFactory也增强了具体窗口组件类之间依赖关系。一个Motif的滚动条应该与Motif按钮、Motif正文编辑器一起使用,这一约束条件作为使用MotifWidgetFactory的结果被自动加上。
注意:
(1)、使用端只是调用WidgetFactory的接口方法来产生需要的组件而不须去理会到底是由哪一个具体类所实现的。
(2)、每一个WidgetFactory子类分别实现其建立组件的操作。
(3)、WidgetFactory同时强调接口方法创建的具体类之间的相依性,不同的WidgetFactory子类所产生的实例对象不得共享。
(4)、我们仅需转换到相应的工厂对象,就可实现从Motif窗口组件转换为PresentationManager窗口组件。
代码:
unit uWidgetFactory;
interface
uses
Dialogs;
type
TScrollBar = class
public
procedure Show; virtual; abstract;
end;
TWindow = class
public
procedure Show; virtual; abstract;
end;
TMotifScrollBar = class(TScrollBar)
public
procedure Show; override;
end;
TMotifWindow = class(TWindow)
public
procedure Show; override;
end;
TPMScrollBar = class(TScrollBar)
public
procedure Show; override;
end;
TPMWindow = class(TWindow)
public
procedure Show; override;
end;
TWidgetFactory = class
public
function CreateWindow: TWindow; virtual; abstract;
function CreateScrollBar: TScrollBar; virtual; abstract;
end;
TMotifWidgetFactory = class(TWidgetFactory)
public
function CreateWindow: TWindow; override;
function CreateScrollBar: TScrollBar; override;
end;
TPMWidgetFactory = class(TWidgetFactory)
public
function CreateWindow: TWindow; override;
function CreateScrollBar: TScrollBar; override;
end;
implementation
function TMotifWidgetFactory.CreateWindow: TWindow;
begin
Result := TMotifWindow.Create;
end;
function TMotifWidgetFactory.CreateScrollBar: TScrollBar;
begin
Result := TMotifScrollBar.Create;
end;
function TPMWidgetFactory.CreateWindow: TWindow;
begin
Result := TPMWindow.Create;
end;
function TPMWidgetFactory.CreateScrollBar: TScrollBar;
begin
Result := TPMScrollBar.Create;
end;
procedure TMotifScrollBar.Show;
begin
showmessage('这是一个Motif的滚动条');
end;
procedure TPMScrollBar.Show;
begin
showmessage('这是一个Presentation Manager的滚动条');
end;
procedure TMotifWindow.Show;
begin
showmessage('这是一个Motif的窗口');
end;
procedure TPMWindow.Show;
begin
showmessage('这是一个Presentation Manager的窗口');
end;
end.
procedure TForm2.Button1Click(Sender: TObject);
var
AFactory: TWidgetFactory;
AWindow: TWindow;
AScrollBar: TScrollBar;
begin
//AFactory := TMotifWidgetFactory.Create;
AFactory := TPMWidgetFactory.Create;
AWindow := AFactory.CreateWindow;
AScrollBar := AFactory.CreateScrollBar;
//---
AWindow.Show;
AScrollBar.Show;
//---
AWindow.Free;
AScrollBar.Free;
AFactory.Free;
end;
相关文章推荐
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:参数化的工厂
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:可移植的用户界面
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:可移植的用户界面
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:抽象工厂接口
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于原型的工厂
- 《GOF设计模式》—单件(Singleton)—Delphi源码示例:单件接口(使用全局变量)
- 《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:绘图编辑器
- 《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:设备
- 《GOF设计模式》—代理(PROXY)—Delphi源码示例:保护代理(Protection Proxy)
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:仅有一个Implementor
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:外部迭代器
- 《GOF设计模式》—备忘录(MEMENTO)—Delphi源码示例:一个反映备忘录模式的迭代接口
- 《GOF设计模式》—单件(Singleton)—Delphi源码示例:单件接口(使用类字段)
- 《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(使用抽象操作)
- 《GOF设计模式》—代理(PROXY)—Delphi源码示例:智能指引(Smart Reference)
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:共享Implementor对象
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:避免限定于一种特定的列表实现(一般迭代)