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