免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
用 Delphi 學設計模式(一) 之簡單工廠篇
       本文在大富翁發(fā)表已將近一個月,作為理論性比較強的內(nèi)容,反映比較熱烈并被轉(zhuǎn)載和收藏,由于我的 Blog 已開通,現(xiàn)將全文在 Blog 中重新發(fā)布并刪除大富翁上的原貼 ,轉(zhuǎn)載請注明出處。下面是正文:

        大約半年前看了閻宏老師的《Java與模式》,里面的工廠模式篇基本上還看懂了點,當時用 Delphi 改寫了其中幾個例程,現(xiàn)在拿出來與大家分享,里面的注釋是我對這種設計模式的理解,很片面的,如果有什么錯誤希望大家批評指正。

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

        學習設計模式要對面向?qū)ο蟮某绦蛟O計有一定的理解,特別是多態(tài)性 ,如果能看懂下面的例子就沒問題了,呵呵!

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

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

function Factory(): TFruit;
var 
    f:TFruit;
begin
  //精髓就是這條語句了,明明創(chuàng)建了TApple對象,
  //卻將他賦值給TFruit類型的變量
  //其實這樣做好處大大的,后面就體會到了
  f:=TApple.Create();
  result:=f;
end
 

        在例程中我用到了接口 ,不明白得可以把它當成一個比抽象類還抽象的抽象類,說白了把它當成一個類就沒錯。 下面開始吧。。。。。。。

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

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

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

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

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

//果園就是我們所說的簡單工廠(Factory)

//而葡萄、蘋果和草莓這三種水果就是工廠里的產(chǎn)品 (Pruduct)

//完成產(chǎn)品的過程稱之為外部使用者(Produce)

//使用簡單工廠的好處是:

//1、充分利用了多態(tài)性
//不管你種什么,果園返回的對象并不是具體的葡萄、蘋果或者草莓
//而是返回一個他們的抽象對象 -- 水果(IFruit)

//2、充分利用了封裝性
//內(nèi)部產(chǎn)品發(fā)生變化時外部使用者不會受到影響

//他的缺點是:
//如果增加了新的產(chǎn)品,就必須得修改工廠(Factory)

這是定義簡單工廠的單元文件源代碼:
//SimpleFactory.pas 定義簡單工廠的單元文件

//代碼如下==========

unit SimpleFactory;

interface

uses
  SysUtils;

type

  //水果類,它是一個抽象產(chǎn)品
  //僅僅聲明了所有對象共有的接口,并不實現(xiàn)他們
  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 是一個靜態(tài)函數(shù),可以直接使用
    //2、注意返回值,他返回的是最抽象的產(chǎn)品 IFruit 水果類
    //3、注意他有一個參數(shù),來告訴工廠創(chuàng)建哪一種水果
    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:=‘葡萄已經(jīng)種好了......‘;
end;

{ ********** TApple ********** }

function TApple.Grow: string;
begin
  result:=‘蘋果正在生長......‘;
end;

function TApple.Harvest: string;
begin
  result:=‘蘋果可以收獲了......‘;
end;

function TApple.Plant: string;
begin
  result:=‘蘋果已經(jīng)種好了......‘;
end;

{ ********** TStrawberry ********** }

function TStrawberry.Grow: string;
begin
  result:=‘草莓正在生長......‘;
end;

function TStrawberry.Harvest: string;
begin
  result:=‘草莓可以收獲了......‘;
end;

function TStrawberry.Plant: string;
begin
  result:=‘草莓已經(jīng)種好了......‘;
end;

{ ********** TFruitGardener ********** }

class function TFruitGardener.Factory(whichFruit:string): IFruit;
begin
  //精髓就是這條語句了 result:= TApple.Create()
  //不明白趕緊去復習復習什么是多態(tài)性
  if(LowerCase(whichFruit)=‘a(chǎn)pple‘)then result:=TApple.Create()
  else if(LowerCase(whichFruit)=‘grape‘)then result:=TGrape.Create()
  else if(LowerCase(whichFruit)=‘strawberry‘)then result:=TStrawberry.Create()
  else Raise NoThisFruitException.Create(‘這種水果還沒有被種植!‘);
end;

end.

窗體界面:
//MainForm.pas 窗體文件,這里說明怎樣使用簡單工廠

unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,SimpleFactory, StdCtrls;

type
  TForm1 = class(TForm)
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    procedure RadioButton1Click(Sender: TObject);
    procedure RadioButton2Click(Sender: TObject);
    procedure RadioButton3Click(Sender: TObject);
    procedure RadioButton4Click(Sender: TObject);
  public
    procedure Produce(fruitName:string);
  end;
  
var
  Form1: TForm1;

implementation

{ ********** TForm1 ********** }

//這就是生產(chǎn)過程
//IFruit 類型的臨時變量 f 自己知道種的是哪種水果,有趣吧
//想要什么盡管來種,果園大豐收啦!
procedure TForm1.Produce(fruitName:string);
var
  f: IFruit;
begin
  try
    f:=TFruitGardener.Factory(fruitName);
    ShowMessage(f.Plant());
    ShowMessage(f.Grow());
    ShowMessage(f.Harvest());
  except
    on e:NoThisFruitException do  Messagedlg(e.Message,mtInformation,[mbOK],0);
  end;
end;

{$R *.dfm}


procedure TForm1.RadioButton1Click(Sender: TObject);
begin
  Produce(‘a(chǎn)pple‘);
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
   Produce(‘grape‘);
end;

procedure TForm1.RadioButton3Click(Sender: TObject);
begin
  Produce(‘strawberry‘);
end;

procedure TForm1.RadioButton4Click(Sender: TObject);
begin
  Produce(‘other‘);
end;

end.


        工廠模式的目的就是,把創(chuàng)建對象的責任和使用對象的責任分開,工廠負責統(tǒng)一創(chuàng)建具體產(chǎn)品(蘋果、葡萄和草莓),然后再把這些產(chǎn)品轉(zhuǎn)化為他們的抽象產(chǎn)品(水果)返回給外部使用者,作為使用者關心的僅僅是抽象產(chǎn)品預留的接口,而不關心他們是怎么創(chuàng)建的。這樣,即使因為某些原因?qū)е聞?chuàng)建產(chǎn)品的過程發(fā)生變化,也不會影響到外部使用者,在一定程度上保證了程序的可維護性。 

        如果把具體產(chǎn)品類(TApple、TFrabe、TStrawberry)暴露到外部,如果內(nèi)部的代碼發(fā)生了變動,外部也會受到影響,工廠就失去了他的意義。


本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
delphi 結(jié)構(gòu)自動釋放 接口自動釋放
delphi 虛擬桌面原理及實現(xiàn)
delphi基礎開發(fā)技巧
XML編程手記,XML操作類
vclzip壓縮
Delphi 的接口
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服