熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

用Delphi2005學設計模式之工廠方法篇

2013-11-11 21:04:33  來源: Delphi編程 
本文完成以下內容
  
  代碼用支持中文的 Delphi 編譯並通過並去除了其中一些無關緊要的地方如異常處理等
  
  重新設計一個情景分別用簡單工廠模式工廠方法模式兩種方法實現請體會其中的差別
  
  在情景中添加一個子類後請體會簡單工廠模式工廠方法模式兩種方法不同的處理方式
  
  如果不理解什麼是接口多態靜態函數等概念這裡不作解釋請看第一章或找相關資料
  
  本文的情景和上文差不多只是把工廠從果園變成了水果小販同樣的三種水果蘋果葡萄草莓每種水果都封裝了兩個邏輯在和外部交易時會用到這兩個邏輯 最後請重新回顧開閉原則
  
  下面開始吧
  
  這裡是簡單工廠模式的實現方法在這種模式中
  
  一個小販要負責所有三種水果的交易這對他來說是很大的挑戰噢不信您看!
  
  顧客必須對水果的名字有一個准確地描述這樣水果才會賣給你這很影響生意呀!
  
  //簡單工廠類和水果類單元文件
  
  unit SimpleFactory;
  
  interface
  
  type
  接口_水果 = interface(IInterface)
  function 提示():string;
  function 被評價():string;
  end;
  
  類_蘋果 = class(TInterfacedObject 接口_水果)
  function 提示():string;
  function 被評價():string;
  end;
  
  類_葡萄 = class(TInterfacedObject 接口_水果)
  function 提示():string;
  function 被評價():string;
  end;
  
  類_草莓 = class(TInterfacedObject 接口_水果)
  function 提示():string;
  function 被評價():string;
  end;
  
  工廠類_小販 = class(TObject)
  public
  class function 工廠(水果名:string): 接口_水果;
  end;
  
  implementation
  
  {***** 類_蘋果 *****}
  
  function 類_蘋果提示():string;
  begin
  result:=削了皮再吃!;
  end;
  
  function 類_蘋果被評價():string;
  begin
  result:=還不錯挺甜!;
  end;
  
  {*****類_葡萄 *****}
  
  function 類_葡萄提示():string;
  begin
  result:=別把核咽下去了!;
  end;
  
  function 類_葡萄被評價():string;
  begin
  result:=沒有核呀???;
  end;
  
  {***** 類_草莓 *****}
  
  function 類_草莓提示():string;
  begin
  result:=別怪我沒告訴你很酸!;
  end;
  
  function 類_草莓被評價():string;
  begin
  result:=試試?哇牙快酸掉了!;
  end;
  
  {***** 工廠類_小販 *****}
  
  class function 工廠類_小販工廠(水果名:string): 接口_水果;
  begin
  if(水果名=蘋果)then result:=類_蘋果Create()
  else if(水果名=葡萄)then result:=類_葡萄Create()
  else if(水果名=草莓)then result:=類_草莓Create();
  end;
  end
  //窗體單元文件
  
  unit MainForm;
  
  interface
  
  uses
  Windows Messages SysUtils Variants Classes Graphics Controls Forms
  Dialogs StdCtrlsSimpleFactory;
  
  type
  TForm = class(TForm)
  RadioButton: TRadioButton;
  RadioButton: TRadioButton;
  RadioButton: TRadioButton;
  procedure RadioButtonClick(Sender: TObject);
  procedure RadioButtonClick(Sender: TObject);
  procedure RadioButtonClick(Sender: TObject);
  private
  procedure 交易(水果名:string);
  end;
  
  var
  Form: TForm;
  
  implementation
  
  {$R *dfm}
  
  procedure TForm交易(水果名:string);
  var
  我買的水果: 接口_水果;
  begin
  我買的水果:=工廠類_小販工廠(水果名);
  ShowMessage(我買的水果提示);
  ShowMessage(我買的水果被評價);
  end;
  
  procedure TFormRadioButtonClick(Sender: TObject);
  begin
  交易(蘋果);
  end;
  
  procedure TFormRadioButtonClick(Sender: TObject);
  begin
  交易(葡萄);
  end;
  
  procedure TFormRadioButtonClick(Sender: TObject);
  begin
  交易(草莓);
  end;
  end
  
  這裡是工廠方法模式的實現方法在這種模式中
  
  每一種水果都對應有一個小販負責這樣他們做起生意來就輕松多了呵呵!
  
  顧客直接和小販打交道他知道您要什麼這樣就不會因為說不清那討厭的水果名字而吃不上說水果了
  
  //工廠類和水果類單元文件
  
  unit FactoryMethod;
  
  interface
  
  type
  接口_水果 = interface(IInterface)
  function 提示():string;
  function 被評價():string;
  end;
  
  類_蘋果 = class(TInterfacedObject 接口_水果)
  function 提示():string;
  function 被評價():string;
  end;
  
  類_葡萄 = class(TInterfacedObject 接口_水果)
  function 提示():string;
  function 被評價():string;
  end;
  
  類_草莓 = class(TInterfacedObject 接口_水果)
  function 提示():string;
  function 被評價():string;
  end;
  
  接口_小販 = interface(IInterface)
  function 工廠(): 接口_水果;
  end;
  
  類_蘋果小販 = class(TInterfacedObject 接口_小販)
  function 工廠(): 接口_水果;
  end;
  
  類_葡萄小販 = class(TInterfacedObject 接口_小販)
  function 工廠(): 接口_水果;
  end;
  
  類_草莓小販 = class(TInterfacedObject 接口_小販)
  function 工廠(): 接口_水果;
  end;
  
  implementation
  
  {****** 類_蘋果 ******}
  
  function 類_蘋果提示():string;
  begin
  result:=削了皮再吃!;
  end;
  
  function 類_蘋果被評價():string;
  begin
  result:=還不錯挺甜!;
  end;
  
  {****** 類_葡萄 ******}
  
  function 類_葡萄提示():string;
  begin
  result:=別把核咽下去了!;
  end;
  
  function 類_葡萄被評價():string;
  begin
  result:=沒有核呀???;
  end;
  
  {****** 類_草莓 ******}
  
  function 類_草莓提示():string;
  begin
  result:=別怪我沒告訴你很酸!;
  end;
  
  function 類_草莓被評價():string;
  begin
  result:=試試?哇牙快酸掉了!;
  end;
  
  {***** 類_蘋果小販 *****}
  
  function 類_蘋果小販工廠(): 接口_水果;
  begin
  result:=類_蘋果Create()
  end;
  
  {***** 類_葡萄小販 *****}
  
  function 類_葡萄小販工廠(): 接口_水果;
  begin
  result:=類_葡萄Create()
  end;
  
  {***** 類_草莓小販 *****}
  
  function 類_草莓小販工廠(): 接口_水果;
  begin
  result:=類_草莓Create()
  end;
  end
  
  //窗體單元文件
  
  unit MainForm;
  
  interface
  
  uses
  Windows Messages SysUtils Variants Classes Graphics Controls Forms
  Dialogs StdCtrlsFactoryMethod;
  
  type
  TForm = class(TForm)
  RadioButton: TRadioButton;
  RadioButton: TRadioButton;
  RadioButton: TRadioButton;
  procedure RadioButtonClick(Sender: TObject);
  procedure RadioButtonClick(Sender: TObject);
  procedure RadioButtonClick(Sender: TObject);
  private
  procedure 交易(小販:接口_小販);
  end;
  
  var
  Form: TForm;
  
  implementation
  
  {$R *dfm}
  
  procedure TForm交易(小販:接口_小販);
  var
  我買的水果:接口_水果;
  begin
  我買的水果:=小販工廠();
  ShowMessage(我買的水果提示);
  ShowMessage(我買的水果被評價);
  end;
  
  procedure TFormRadioButtonClick(Sender: TObject);
  begin
  交易(類_蘋果小販Create);
  end;
  
  procedure TFormRadioButtonClick(Sender: TObject);
  begin
  交易(類_葡萄小販Create);
  end;
  
  procedure TFormRadioButtonClick(Sender: TObject);
  begin
  交
From:http://tw.wingwit.com/Article/program/Delphi/201311/8421.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.