框架接口是采用類廠來管理的
一個接口要被框架管理的實現步驟
首先是接口定義,接口實現類,接口實例創建函數,指定類廠
unit BplOneIntf; {$WEAKPACKAGEUNIT ON} interface type IBplOne=interface ['{E4C1C5FA-C598-4834-9111-26B52634068D}'] function Add(A,B:Integer):integer; function Sub(A,B:Integer):Integer; end; implementation end.
這是接口的定義文件,如果一個接口是可以提供給其它模塊調用的話,那麼就放到一個公共目錄,並加入Delphi搜索路徑,方便調用
unit BplOneObj; interface uses sysUtils,Classes,SysFactory,BplOneIntf;//記得這裡引用你的接口單元 Type TBplOne=Class(TInterfacedObject,IBplOne)//假設你的接口叫IXXX(以下同) private protected {IXXX} //這裡加上你接口方法,然後按Ctrl+Shift+C,實現你的接口... function Add(A,B:Integer):integer; function Sub(A,B:Integer):Integer; Public End; implementation procedure Create_BplOne(out anInstance: IInterface); begin anInstance:=TBplOne.Create; end; { TBplOne } function TBplOne.Add(A, B: Integer): integer; begin result:=A+B; end; function TBplOne.Sub(A, B: Integer): Integer; begin result:=A-B; end;
var Factory:TObject;
initialization
Factory:=TIntfFactory.Create(IBplOne,@Create_BplOne);
finalization
Factory.Free;
end.
這裡分別是接口的實現類TBplOne,接口實例創建函數Create_BplOne(out anInstance: IInterface);以及接口工廠TIntfFactory的創建
框架提供了三種類廠TIntfFactory接口工廠,TSingletonFactory單實例工廠,TObjFactory實例工廠
其中TIntfFactory接口工廠,是在接口調用時,通過接口實例創建函數來創建實例對象
TSingletonFactory單實例工廠則是在第一次接口調用時通過接口實例創建函數來創建實例對象並保存該對象,再次調用時則返回先前創建的對象
TObjFactory實例工廠則是將一個已經創建好的對象與接口綁定,當調用接口時則返回該對象
單實例工廠與實例工廠都是只有一個實例對象,不同的是,單實例工廠是在第一次調用時創建對象,而實例工廠的實例則是預先創建好的
以接口工廠TIntfFactory為例,了解一下類廠是如何管理的
constructor TIntfFactory.Create(IID: TGUID; IntfCreatorFunc:TIntfCreatorFunc); begin Flag:=0; self.FIntfCreatorFunc:=IntfCreatorFunc; Inherited Create(IID); end; constructor TBaseFactory.Create(const IID: TGUID); begin if FactoryManager.Exists(IID) then Raise Exception.CreateFmt(Err_IntfExists,[GUIDToString(IID)]); FIntfGUID:=IID; FactoryManager.RegisterFactory(Self); end; procedure TSysFactoryManager.RegisterFactory(aIntfFactory: TFactory); var i:Integer; IIDStr:String; IID:TGUID; begin FSysFactoryList.Add(aIntfFactory); for i := FKeyList.Count - 1 downto 0 do begin IIDStr:=FKeyList[i]; IID :=StringToGUID(IIDStr); if aIntfFactory.Supports(IID) then begin FIndexList.Add(IIDStr,Pointer(aIntfFactory)); FKeyList.Delete(i); end; end; end;
TIntfFactory是TBaseFactory的子類,首先是保存了接口實例創建函數的地址,然後調用基類構造函數,
FactoryManager是一個全局函數,返回的是一個TSysFactoryManager類對象,該類是類廠的管理類,
先判斷是否存在該接口的工廠對象,如果不存在則對接口進行注冊,注冊的步驟就是將接口工廠添加到工廠列表
這樣就實現了接口類廠的注冊。
那麼統一的接口調用又是如何實現的呢?
統一接口調用 SysService as IXXX
function SysService:IInterface; begin if not Assigned(FSysService) then FSysService:=TSysService.Create; Result:=FSysService; end;
SysService是一個全局函數,返回的是一個接口IInterface,由TSysService構造的對象
Type TSysService=Class(TObject,IInterface) private FRefCount: Integer; protected function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; public end; function TSysService.QueryInterface(const IID: TGUID; out Obj): HResult; var aFactory:TFactory; begin Result:=E_NOINTERFACE; if self.GetInterface(IID,Obj) then Result:=S_OK else begin aFactory:=FactoryManager.FindFactory(IID); if Assigned(aFactory) then begin aFactory.CreateInstance(IID,Obj); Result:=S_OK; end; end; end;
而TSysService重新實現了IInterface接口,當一個接口進行as操作的時候,就會調用QueryInterface進行接口查詢
所以SysService as IXXX就會調用接口查詢QueryInterface,
而接口查詢函數首先是通過全局函數FactoryManager返回的TSysFactoryManager類對象,查找是否有該接口的類廠
如果存在該類廠則取出,並通過類廠創建實例返回。
以上就是框架的接口管理。
視頻教程地址:
ERPSYSTEM開發教程01 http://pan.baidu.com/s/1kT7Rb3D
ERPSYSTEM開發教程02 http://pan.baidu.com/s/11xN5s
框架源代碼下載地址 http://pan.baidu.com/s/1jGIc2Su
DEMO源代碼下載地址 http://pan.baidu.com/s/1bnyEafH
聯系QQ:1330009208 (驗證信息請填ERPSYSTEM)