Abstract Factory 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.
生成代码如下
unit unit1;
interface
end;
end;
end;
end;
end;
end;
public
function CreateProductA: TAbstractProductA; virtual; abstract;
function CreateProductB: TAbstractProductB; virtual; abstract;
end;
public
class function GetInstance(ProductType: integer): TAbstractFactory;
end;
public
function CreateProductA: TAbstractProductA; override;
function CreateProductB: TAbstractProductB; override;
end;
public
function CreateProductA: TAbstractProductA; override;
function CreateProductB: TAbstractProductB; override;
end;
}
class function TConcreteFactoryFactory.GetInstance(ProductType: integer):
TAbstractFactory;
begin
if ProductType = 1 then
Result := TConcreteFactory1.Create
else
Result := TConcreteFactory2.Create;
end;
}
function TConcreteFactory2.CreateProductA: TAbstractProductA;
begin
Result := TProductA2.Create;
end;
end;
}
function TConcreteFactory1.CreateProductA: TAbstractProductA;
begin
Result := TProductA1.Create;
end;
end;
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs;
type
TAbstractProductA
end;
TAbstractProductB
= class(TObject)end;
TProductB2
= class(TAbstractProductB)end;
TProductB1
= class(TAbstractProductB)end;
TProductA2
= class(TAbstractProductA)end;
TProductA1
= class(TAbstractProductA)end;
TAbstractFactory
= class(TObject)public
function CreateProductA: TAbstractProductA; virtual; abstract;
function CreateProductB: TAbstractProductB; virtual; abstract;
end;
TConcreteFactoryFactory
= class(TObject)public
class function GetInstance(ProductType: integer): TAbstractFactory;
end;
TConcreteFactory2
= class(TAbstractFactory)public
function CreateProductA: TAbstractProductA; override;
function CreateProductB: TAbstractProductB; override;
end;
TConcreteFactory1
= class(TAbstractFactory)public
function CreateProductA: TAbstractProductA; override;
function CreateProductB: TAbstractProductB; override;
end;
implementation
{
}
class function TConcreteFactoryFactory.GetInstance(ProductType: integer):
TAbstractFactory;
begin
if ProductType = 1 then
Result := TConcreteFactory1.Create
else
Result := TConcreteFactory2.Create;
end;
{
}
function TConcreteFactory2.CreateProductA: TAbstractProductA;
begin
Result := TProductA2.Create;
end;
function TConcreteFactory2.CreateProductB: TAbstractProductB;
begin
Result :
end;
{
}
function TConcreteFactory1.CreateProductA: TAbstractProductA;
begin
Result := TProductA1.Create;
end;
function TConcreteFactory1.CreateProductB: TAbstractProductB;
begin
Result :
end;
end.