程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi語言來學設計模式之簡單工廠篇

用Delphi語言來學設計模式之簡單工廠篇

編輯:Delphi
工廠模式中又分為簡單工廠模式、工廠方法模式和抽象工廠模式 。這裡給大家介紹的簡單工廠模式是其中最簡單的一種。如果大家支持的話我會繼續貼出工廠方法模式和抽象工廠模式等後續篇,要看大家的反應程度哦!

    學習設計模式要對面向對象的程序設計有一定的理解,特別是多態性 ,如果能看懂下面的例子就沒問題了,呵呵!


//水果類,它是一個抽象產品
TFruit = Class(TObject)
...
end;

//蘋果類,水果類的具體化
TApple = class(TFruit)
...
end;

function Factory(): TFruit;
var
 f:TFruit;
begin
 //精髓就是這條語句了,明明創建了TApple對象,
 //卻將他賦值給TFruit類型的變量
 //其實這樣做好處大大的,後面就體會到了
 f:=TApple.Create();
 result:=f;
end
 在例程中我用到了接口 ,不明白得可以把它當成一個比抽象類還抽象的抽象類,說白了把它當成一個類就沒錯。 下面開始吧。。。。。。。

    這是說明:


//我們用一個小果園來說明什麼是簡單工廠

//這個果園裡有葡萄、蘋果和草莓三種水果

//所有的水果都有生長、耕作和收獲三個步驟

//果園的任務就是讓我們得到葡萄、蘋果和草莓這三種水果對象

//我們利用得到的對象可以完成水果生長、耕作和收獲三個步驟

//果園就是我們所說的簡單工廠(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;
<

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved