《GOF设计模式》—原型(Prototype)—Delphi源码示例:基于类的原型管理器(使用TList和TObject对象服务实现)

示例:基于类的原型管理器(使用TListTObject对象服务实现)

代码:

unit uClassManager;

 

interface

 

uses

    SysUtils,Classes,Dialogs;

 

type

    TBaseObjectClass = class of TBaseObject;

 

    TBaseObject = class

    public

        procedure Show; virtual; abstract;

    end;

    TObjectA = class(TBaseObject)

    public

        procedure Show; override;

    end;

    TObjectB = class(TBaseObject)

    public

        procedure Show; override;

    end;

 

    TClassManager = class

    private

        FClassList: TList;

    public

        constructor Create;

        destructor Destroy; override;

        //---

        procedure RegisterClass(AClass: TBaseObjectClass);

        procedure UnregisterClass(AClass: TBaseObjectClass);

        function Registered(AClass: TBaseObjectClass): Boolean;

        function GetClass(const AClassName: string): TBaseObjectClass;

    end;

 

procedure RegisterClasses(AClasses: array of TBaseObjectClass);

function GetClass(const AClassName: string): TBaseObjectClass;

 

implementation

 

var

    ClassManager: TClassManager;

 

function GetClass(const AClassName: string): TBaseObjectClass;

begin

    Result := ClassManager.GetClass(AClassName);

end;

 

procedure RegisterClasses(AClasses: array of TBaseObjectClass);

var

    I: Integer;

begin

    for I := Low(AClasses) to High(AClasses) do

        ClassManager.RegisterClass(AClasses[I]);

end;

 

procedure TObjectA.Show;

begin

    showmessage('这是ObjectA');

end;

 

procedure TObjectB.Show;

begin

    showmessage('这是ObjectB');

end;

 

constructor TClassManager.Create;

begin

    FClassList := TList.Create;

end;

 

destructor TClassManager.Destroy;

begin

    FClassList.Free;

    //---

    inherited;

end;

 

function TClassManager.GetClass(const AClassName: string): TBaseObjectClass;

var

    I: Integer;

begin

    with FClassList do

    begin

        for I := 0 to Count - 1 do

        begin

            Result := Items[I];

            if Result.ClassNameIs(AClassName) then

                Exit;

        end;

    end;

    //---

    Result := nil;

end;

 

procedure TClassManager.RegisterClass(AClass: TBaseObjectClass);

var

    LClassName: string;

begin

    if Registered(AClass) then

    begin

        LClassName := AClass.ClassName;

        raise Exception.CreateFmt('A class named %s already exists', [LClassName]);

    end

    else

        FClassList.Add(AClass);

end;

 

function TClassManager.Registered(AClass: TBaseObjectClass): Boolean;

begin

    Result := FClassList.IndexOf(AClass) >= 0;

end;

 

procedure TClassManager.UnregisterClass(AClass: TBaseObjectClass);

begin

    FClassList.Remove(AClass);

end;

 

initialization

    ClassManager := TClassManager.Create;

    RegisterClasses([TObjectA,TObjectB]);

 

finalization

    ClassManager.Free;

end.

 

procedure TForm1.Button1Click(Sender: TObject);

var

    AObject: TBaseObject;

    //---

    function GetClassNameFromIni:string;

    begin

        Result := 'TObjectA';

    end;

begin

    AObject := GetClass(GetClassNameFromIni).Create;

    try

        AObject.Show;

    finally

        AObject.Free;

    end;

end;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值