《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:用户界面工具包

来源:互联网 发布:淘宝小号购买1元一个 编辑:程序博客网 时间:2024/04/28 13:34
示例:用户界面工具包

特点:

当你提供一个产品类库,而只想显示它们的接口而不是实现时。

实现:

考虑一个支持多种视感(look-and-feel)标准的用户界面工具包,例如MotifPresentationManager。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。

为解决这一问题我们可以定义一个抽象的WidgetFactory类,这个类声明了一个用来创建每一类基本窗口组件的接口。每一类窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定视感风格。对于每一个抽象窗口组件类,WidgetFactory接口都有一个返回新窗口组件对象的操作。客户调用这些操作以获得窗口组件实例,但客户并不知道他们正在使用的是哪些具体类。这样客户就不依赖于一般的视感风格,如下页图所示。

 

每一种视感标准都对应于一个具体的WidgetFactory子类。每一子类实现那些用于创建合适视感风格的窗口组件的操作。例如,MotifWidgetFactoryCreateScrollBar操作实例化并返回一个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;

原创粉丝点击