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); 这次特奉上源码,具体的还请看<<设计模式>>一书. |