《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:用户界面工具包
来源:互联网 发布:淘宝小号购买1元一个 编辑:程序博客网 时间:2024/04/28 13:34
示例:用户界面工具包
特点:
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
实现:
考虑一个支持多种视感(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设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:抽象工厂接口
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于原型的工厂
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于类的工厂
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:参数化的工厂
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:工厂方法接口
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:参数化工厂方法
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:延迟初始化对象
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:基于工厂方法的迷宫
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:基于工厂方法的迷宫
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:基于工厂方法的迷宫
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:为子类提供挂钩(hook)
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:平行的类层级架构
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:可移植的用户界面
- 《GOF设计模式》—装饰(DECORATOR)—Delphi源码示例:图形用户界面组件
- eBiz
- 使用Javascript创建付款操作的弹出层
- 制作Ubuntu deb包的三种方法
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:抽象工厂接口
- html5 canvas
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:用户界面工具包
- [读]4. Communication is King; Clarity and Leadership its humble servants
- 教你恢复被误删除的Linux文件
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于原型的工厂
- 如何隐藏win32 控制台程序的console窗口
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于类的工厂
- .net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:参数化的工厂
- java并发和线程的几个示例类