抽象工厂(Abstract Factory)模式也叫工具箱,它提供一个用于构建一群相关或相互依赖的对象,而无需指定他们的具体类。
unit NewPas;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs;
type
TCPU = class (TObject)
end ;
TAMD3400 = class (TCPU)
end ;
TIntelCPU = class (TCPU)
end ;
TAMDDoubleCore = class (TCPU)
end ;
TIntelDoubleCore = class (TCPU)
end ;
THardDisk = class (TObject)
end ;
TSATAHardDisk = class (THardDisk)
end ;
TIDEHardDisk = class (THardDisk)
end ;
TNotebookIDEHardDisk = class (THardDisk)
end ;
TNotebookSATAHardDisk = class (THardDisk)
end ;
IComputerFactory = interface (IInterface)
[ ' {0FBF5ADD-F28E-45E5-AC22-D76FE9A2FFB3}']
function CreateCPU: TCPU;
function CreateHardDisk: THardDisk;
end ;
TDellNotebookComputerFactory = class (TInterfacedObject, IComputerFactory)
public
function CreateCPU: TCPU;
function CreateHardDisk: THardDisk;
end ;
TLegendPCComputerFactory = class (TInterfacedObject, IComputerFactory)
public
function CreateCPU: TCPU;
function CreateHardDisk: THardDisk;
end ;
TComputer = class (TInterfacedObject)
private
FCPU: TCPU;
FHardDisk: THardDisk;
public
constructor Create(ComputerFactory: IComputerFactory);
property CPU: TCPU read FCPU write FCPU;
property HardDisk: THardDisk read FHardDisk write FHardDisk;
end ;
implementation
{ TComputer }
constructor TComputer.Create(ComputerFactory: IComputerFactory);
begin
FCPU : = ComputerFactory.CreateCPU;
FHardDisk : = ComputerFactory.CreateHardDisk;
end ;
{ TDellNotebookComputerFactory }
function TDellNotebookComputerFactory.CreateCPU: TCPU;
begin
Result : = TIntelDoubleCore.Create;
end ;
function TDellNotebookComputerFactory.CreateHardDisk: THardDisk;
begin
Result : = TNotebookSATAHardDisk.Create;
end ;
{ TLegendPCComputerFactory }
function TLegendPCComputerFactory.CreateCPU: TCPU;
begin
Result : = TAMD3400.Create;
end ;
function TLegendPCComputerFactory.CreateHardDisk: THardDisk;
begin
Result : = TIDEHardDisk.Create;
end ;
end .
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs;
type
TCPU = class (TObject)
end ;
TAMD3400 = class (TCPU)
end ;
TIntelCPU = class (TCPU)
end ;
TAMDDoubleCore = class (TCPU)
end ;
TIntelDoubleCore = class (TCPU)
end ;
THardDisk = class (TObject)
end ;
TSATAHardDisk = class (THardDisk)
end ;
TIDEHardDisk = class (THardDisk)
end ;
TNotebookIDEHardDisk = class (THardDisk)
end ;
TNotebookSATAHardDisk = class (THardDisk)
end ;
IComputerFactory = interface (IInterface)
[ ' {0FBF5ADD-F28E-45E5-AC22-D76FE9A2FFB3}']
function CreateCPU: TCPU;
function CreateHardDisk: THardDisk;
end ;
TDellNotebookComputerFactory = class (TInterfacedObject, IComputerFactory)
public
function CreateCPU: TCPU;
function CreateHardDisk: THardDisk;
end ;
TLegendPCComputerFactory = class (TInterfacedObject, IComputerFactory)
public
function CreateCPU: TCPU;
function CreateHardDisk: THardDisk;
end ;
TComputer = class (TInterfacedObject)
private
FCPU: TCPU;
FHardDisk: THardDisk;
public
constructor Create(ComputerFactory: IComputerFactory);
property CPU: TCPU read FCPU write FCPU;
property HardDisk: THardDisk read FHardDisk write FHardDisk;
end ;
implementation
{ TComputer }
constructor TComputer.Create(ComputerFactory: IComputerFactory);
begin
FCPU : = ComputerFactory.CreateCPU;
FHardDisk : = ComputerFactory.CreateHardDisk;
end ;
{ TDellNotebookComputerFactory }
function TDellNotebookComputerFactory.CreateCPU: TCPU;
begin
Result : = TIntelDoubleCore.Create;
end ;
function TDellNotebookComputerFactory.CreateHardDisk: THardDisk;
begin
Result : = TNotebookSATAHardDisk.Create;
end ;
{ TLegendPCComputerFactory }
function TLegendPCComputerFactory.CreateCPU: TCPU;
begin
Result : = TAMD3400.Create;
end ;
function TLegendPCComputerFactory.CreateHardDisk: THardDisk;
begin
Result : = TIDEHardDisk.Create;
end ;
end .
我们不需要为了Dell GX 620 声明一个非常具体的类
TDellGx620
=
class
(TComputer)
CPU: TIntel(R) 2 .0G;
Memory: TDDR512;
...
end ;
CPU: TIntel(R) 2 .0G;
Memory: TDDR512;
...
end ;
而是说由抽象工厂TDellGx620Factory来构建TComputer具体的部件,这样可以很好的避免类爆炸的问题。