⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myfactory.pas

📁 Software Requirements1. Delphi 6 SP22. Oracle 8i R33. Raize 3.0.94. ExpressQuantumGrid 4.505. Expres
💻 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 + -