知识大全 用Delphi2005学设计模式之简单工厂篇

Posted 工厂

篇首语:一日之计在于晨,一年之计在于春。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Delphi2005学设计模式之简单工厂篇相关的知识,希望对你有一定的参考价值。

用Delphi2005学设计模式之简单工厂篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

工厂模式中又分为简单工厂模式 工厂方法模式和抽象工厂模式 这里给大家介绍的简单工厂模式是其中最简单的一种 如果大家支持的话我会继续贴出工厂方法模式和抽象工厂模式等后续篇 要看大家的反应程度哦!    学习设计模式要对面向对象的程序设计有一定的理解 特别是多态性 如果能看懂下面的例子就没问题了 呵呵!    //水果类 它是一个抽象产品  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)    //使用简单工厂的好处是     // 充分利用了多态性  //不管你种什么 果园返回的对象并不是具体的葡萄 苹果或者草莓  //而是返回一个他们的抽象对象 水果(IFruit)    // 充分利用了封装性  //内部产品发生变化时外部使用者不会受到影响    //他的缺点是   //如果增加了新的产品 就必须得修改工厂(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  // 注意 class 关键字 它定义工厂方法 Factory 是一个静态函数 可以直接使用  // 注意返回值 他返回的是最抽象的产品 IFruit 水果类  // 注意他有一个参数 来告诉工厂创建哪一种水果  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;    function TApple Plant: string;  begin  result:= 苹果已经种好了 ;  end;     ********** TStrawberry **********     function TStrawberry Grow: string;  begin  result:= 草莓正在生长 ;  end;    function TStrawberry Harvest: string;  begin  result:= 草莓可以收获了 ;  end;    function TStrawberry Plant: string;  begin  result:= 草莓已经种好了 ;  end;     ********** TFruitGardener **********     class function TFruitGardener Factory(whichFruit:string): IFruit;  begin  //精髓就是这条语句了 result:= TApple Create()  //不明白赶紧去复习复习什么是多态性  if(LowerCase(whichFruit)= apple )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  TForm = class(TForm)  RadioButton : TRadioButton;  RadioButton : TRadioButton;  RadioButton : TRadioButton;  RadioButton : TRadioButton;  procedure RadioButton Click(Sender: TObject);  procedure RadioButton Click(Sender: TObject);  procedure RadioButton Click(Sender: TObject);  procedure RadioButton Click(Sender: TObject);  public  procedure Produce(fruitName:string);  end;    var  Form : TForm ;    implementation     ********** TForm **********     //这就是生产过程  //IFruit 类型的临时变量 f 自己知道种的是哪种水果 有趣吧  //想要什么尽管来种 果园大丰收啦!  procedure TForm 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] );  end;  end;    $R * dfm    procedure TForm RadioButton Click(Sender: TObject);  begin  Produce( apple );  end;    procedure TForm RadioButton Click(Sender: TObject);  begin  Produce( grape );  end;    procedure TForm RadioButton Click(Sender: TObject);  begin  Produce( strawberry );  end;    procedure TForm RadioButton Click(Sender: TObject);  begin  Produce( other );  end;    end     工厂模式的目的就是 把创建对象的责任和使用对象的责任分开 工厂负责统一创建具体产品(苹果 葡萄和草莓) 然后再把这些产品转化为他们的抽象产品(水果)返回给外部使用者 作为使用者关心的仅仅是抽象产品预留的接口 而不关心他们是怎么创建的 这样 即使因为某些原因导致创建产品的过程发生变化 也不会影响到外部使用者 在一定程度上保证了程序的可维护性     如果把具体产品类(TApple TFrabe TStrawberry)暴露到外部 如果内部的代码发生了变动 外部也会受到影响 工厂就失去了他的意义 cha138/Article/program/Delphi/201311/24659

相关参考

知识大全 用Delphi语言来学设计模式之简单工厂篇

用Delphi语言来学设计模式之简单工厂篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 C#设计模式之简单工厂篇

C#设计模式之简单工厂篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先定义一个接口具体名为

知识大全 基于Delphi的组件设计之简单实例

基于Delphi的组件设计之简单实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!这是一个可以计数

知识大全 用Delphi2005和DUnit搭建敏捷开发平台

用Delphi2005和DUnit搭建敏捷开发平台  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!之

知识大全 SQL Server2005的XML数据类型之基础篇[2]

SQLServer2005的XML数据类型之基础篇[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 SQL Server2005的XML数据类型之基础篇[4]

SQLServer2005的XML数据类型之基础篇[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 SQL Server2005的XML数据类型之基础篇[1]

SQLServer2005的XML数据类型之基础篇[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 SQL Server2005的XML数据类型之基础篇[3]

SQLServer2005的XML数据类型之基础篇[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 ASP.NET 2.0+VS2005利器大评析之优点篇

ASP.NET2.0+VS2005利器大评析之优点篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 用Delphi实现BP机、手机短讯 精华篇[2]

用Delphi实现BP机、手机短讯精华篇[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!现在以