📄 myfactory.pas
字号:
unit MyFactory;
interface
uses
ComObj, Classes, SysUtils,
MyModel, UModel;
type
IModelFactory = interface
function GetModel: TModel;
procedure FreeModel;
end;
TModelFactory = class(TComObject, IModelFactory)
private
Instance: TModel;
Count: Integer;
private
procedure InitModel(var Model: TModel);
protected
function CheckInstance: Boolean;
function NewModel: TModel; virtual; abstract;
function GetOwner: TComponent; virtual;
public
constructor Create; virtual;
destructor Destroy; override;
{---------------------------------------- IModelFactory ----------------------------------------}
function GetModel: TModel; virtual;
procedure FreeModel; virtual;
end;
implementation
uses
Dialogs, MyException, UDataModel, UCloneDataModel;
{ TModelFactory }
function TModelFactory.CheckInstance: Boolean;
begin
if Assigned(Instance) then
Result := True
else
Result := False;
end;
constructor TModelFactory.Create;
begin
Instance := nil;
Count := 0;
end;
destructor TModelFactory.Destroy;
begin
Count := 0;
FreeAndNil(Instance);
inherited;
end;
procedure TModelFactory.FreeModel;
begin
{
Dec(Count);
if Count <= 0 then
if Assigned(Instance) then
FreeAndNil(Instance);
}
end;
function TModelFactory.GetModel: TModel;
begin
if not CheckInstance then
try
Instance := NewModel;
InitModel(Instance);
Inc(Count);
except
on E: Exception do
begin
Instance := nil;
raise EInitInstanceException.Create(Self.ClassName, E.Message);
end;
end;
Result := Instance;
end;
function TModelFactory.GetOwner: TComponent;
begin
Result := nil;
end;
procedure TModelFactory.InitModel(var Model: TModel);
var
DataModel: TDataModel;
begin
if Model is TDataModel then
DataModel := TDataModel(Model);
if DataModel.IsAutoOpenDataSet then
try
DataModel.OpenDataSet;
except
on E: Exception do
raise EOpenDataSetException.Create(Self.ClassName, E.Message);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -