學習設計模式要對面向對象的程序設計有一定的理解,特別是多態性 ,如果能看懂下面的例子就沒問題了,呵呵!
這是說明:
//我們用一個小果園來說明什麼是簡單工廠
//這個果園裡有葡萄、蘋果和草莓三種水果
//所有的水果都有生長、耕作和收獲三個步驟
//果園的任務就是讓我們得到葡萄、蘋果和草莓這三種水果對象
//我們利用得到的對象可以完成水果生長、耕作和收獲三個步驟
//果園就是我們所說的簡單工廠(Factory)
//而葡萄、蘋果和草莓這三種水果就是工廠裡的產品 (Pruduct)
//完成產品的過程稱之為外部使用者(Produce)
//使用簡單工廠的好處是:
//1、充分利用了多態性
//不管你種什麼,果園返回的對象並不是具體的葡萄、蘋果或者草莓
//而是返回一個他們的抽象對象 -- 水果(IFruit)
//2、充分利用了封裝性
//內部產品發生變化時外部使用者不會受到影響
//他的缺點是:
//如果增加了新的產品,就必須得修改工廠(Factory)
//SimpleFactory.pas 定義簡單工廠的單元文件
//代碼如下==========
unit SimpleFactory;
interface
uses
SysUtils;
type
//水果類,它是一個抽象產品
//僅僅聲明了所有對象共有的接口,並不實現他們
IFruit = interface(IInterface)
function Grow: string; //生長
function Harvest: string; //收獲
function Plant: string;//耕作
end;
//葡萄類,水果類的具體化
TGrape = class(TInterfacedObject, IFruit)
function Grow: string;
function Harvest: string;
function Plant: string;
end;
//蘋果類,水果類的具體化
TApple = class(TInterfacedObject, IFruit)
function Grow: string;
function Harvest: string;
function Plant: string;
end;
//草莓類,水果類的具體化
TStrawberry = class(TInterfacedObject, IFruit)
function Grow: string;
function Harvest: string;
function Plant: string;
end;
//果園類,它就是工廠類,負責給出三種水果的實例
TFruitGardener = class(TObject)
public
//1、注意 class 關鍵字,它定義工廠方法 Factory 是一個靜態函數,可以直接使用
//2、注意返回值,他返回的是最抽象的產品 IFruit 水果類
//3、注意他有一個參數,來告訴工廠創建哪一種水果
class function Factory(whichFruit:string): IFruit;
end;
//聲明一個異常,這不是重點
NoThisFruitException = class(Exception)
end;
implementation
{ ********** TGrape ********** }
function TGrape.Grow: string;
begin
result:=‘葡萄正在生長......‘;
end;
function TGrape.Harvest: string;
begin
result:=‘葡萄可以收獲了......‘;
end;
function TGrape.Plant: string;
begin
result:=‘葡萄已經種好了......‘;
end;
{ ********** TApple ********** }
function TApple.Grow: string;
begin
result:=‘蘋果正在生長......‘;
end;
function TApple.Harvest: string;
begin
result:=‘蘋果可以收獲了......‘;
end;
<