unit Unit2;
interface uses windows, dialogs, sysutils, classes;
type //---------------------------------------------------------------------
TProductID = (One, Two, Three);
TProduct = class //定义产品父类 public
constructor Create; virtual; end;
TProductOne = class(TProduct) //定义产品一
constructor Create; override; end;
TProductTwo = class(TProduct) //定义产品二
constructor Create; override; end;
TProductThree = class(TProduct) //定义产品三
constructor Create; override; end; // 当然.还可以是FOUR,FIVE................... //---------------------------------------------------------------------
TCreator = class //定义创建者 ,实现缺省定义 public constructor Create; virtual;
function CreateProduct(ProductID: TProductID): TProduct; virtual; end;
TMyCreator = class(TCreator) //定义我的创建者,实现我的定义 constructor Create; override;
function CreateProduct(ProductID: TProductID): TProduct; override;
end; //---------------------------------------------------------------------- implementation
constructor TCreator.Create; begin
// end;
function TCreator.CreateProduct(ProductID: TProductID): TProduct; var
aProduct: TProduct; begin
aProduct := nil;
if ProductID = One then aProduct := TProductOne.Create;
if ProductID = Two then aProduct := TProductTwo.Create;
Result := aProduct; end;
//------------------------------------------------------------------------ constructor TMyCreator.Create; begin
// inherited;
end;
function TMyCreator.CreateProduct(ProductID: TProductID): TProduct; var
aProduct: TProduct;
aCreator: TCreator; begin
aProduct := nil; //在我的定义中调换One和Two;
if ProductID = One then aProduct := TProductTwo.Create;
if ProductID = Two then aProduct := TProductOne.Create;
if ProductID = Three then aProduct := TProductThree.Create;
if aProduct = nil then //如果上述对象创建失败,那么就调用父类的工厂方法 begin
aCreator := Tcreator.Create;
aProduct := aCreator.CreateProduct(ProductID); end;
Result := aProduct; end;
//----------------------------------------------------------------------------
{ TProductOne }
constructor TProductOne.Create; begin
showmessage('This is TproductOne'); end;
{ TProductThree }
constructor TProductThree.Create; begin
showmessage('This is TproductThree'); end;
{ TProductTwo }
constructor TProductTwo.Create; begin
showmessage('This is TproductTwo'); end;
{ TProduct }
constructor TProduct.Create; begin
// end;
end.
总的来说,工厂方法就是利用给Factory对象传递不同的参数,以返回具有相同基类或实现了同一接口的对象。如:
var mytest: Tcreator;
mytest := Tmycreator.Create;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
好了,接下来就改变工厂创建的参数就实现了对象创建时的多态 也就是说用FACTORY不同的子类的不同方法,创建同类的不同子类的对象. 注意:抽象工厂实现了实例创建时的多态; 用FACTORY的的不同的子类的不同方法,创建不同类的不同子类
的对象;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mytest.CreateProduct(One);
mytest.CreateProduct(Two);
mytest.CreateProduct(Three);
这次特奉上源码,具体的还请看<<设计模式>>一书.
|