手机版

示例说明PHP设计模式编程中的工厂方法模式

时间:2021-09-17 来源:互联网 编辑:宝哥软件园 浏览:

工厂方法模式是一种类创建模式,也称为静态工厂方法模式。工厂方法模式是一个工厂对象,用于确定创建产品类的哪个实例。

1.工厂模式的几种形式工厂模式专门负责实例化大量具有公共接口的类。工厂可以动态决定实例化哪个类,而不需要事先知道每次实例化哪个类。工厂模式有几种类型:(1)简单工厂模式,也称为静态工厂方法模式。(2)工厂方法模式,也称为多态工厂模式或虚拟构造器模式;(3)抽象工厂模式,也称为工具包或工具包模式。下面是工厂方法模式的简要类图。

工厂方法模式,或静态工厂方法模式,是不同工厂方法模式的特殊实现。在其他文献中,简单工厂常被作为普通工厂模式的特例来讨论。学习工厂方法模式是学习工厂方法模式的良好准备,也是学习其他模式的良好准备,尤其是单件模式和多案例模式。

2.工厂方法模式介绍。

例如,有一家农场公司向市场出售各种水果。在这个系统中,我们需要描述以下几种水果:葡萄、葡萄、草莓、苹果、苹果,这与其他植物有很大的不同,即水果最终可以采摘食用。那么一个自然的方法就是建立一个适合各种水果的接口,以便和农场里的其他植物区分开来。如下图所示。

水果接口指定了所有水果必须实现的接口,包括任何水果必须具备的方法:种植植物(),生长()和收获()。界面水果的类图如下所示。

这个水果界面的源代码如下所示。清单1:接口水果的源代码。

接口水果{公共函数grow();公共功能收割();公共功能工厂();}Apple类是水果类的一种,所以实现了水果接口声明的所有方法。此外,因为苹果是多年生植物,所以有一个额外的树龄属性来描述苹果树的树龄。下面是这个apple类的源代码。清单2:苹果类的源代码。

类Apple实现了水果{ private $ _ treeAge公共函数grow(){echo 'Apple正在增长';}公共函数harvest(){echo '苹果已经收割了';}公共功能植物(){echo '苹果已经种下了';}public函数getTreeAge(){ return $ this-_ treeAge;}public函数settreage($ tree age){ $ this-_ tree age=(int)$ tree age;}}同样,葡萄类是一种水果类,也实现了水果接口声明的所有方法。然而,葡萄是有种子的,而且是无核的,所以它们比普通水果更具有无核特性,如下图所示。

葡萄类的源代码如下所示。可以看到,葡萄类还实现了水果接口,这是水果类型的一个子类型。清单3:葡萄类的源代码。

class葡萄实现水果{ private $无核;公共函数grow(){echo '葡萄正在生长';}公共功能收割(){echo '葡萄已收割';}公共功能植物(){echo '葡萄已种植';} public function无核(){ return $ this-无核;} public function setnusey($无核){ $ this-nusey=(boolean)$ nusey;} }草莓类实现了水果接口,所以也是水果类型的一个子类型,其源代码如下。清单4:草莓类的源代码。

class草莓实现了水果{public function grow(){echo '草莓正在生长';}公共函数harvest(){echo '草莓已收获';}公共功能植物(){echo '草莓已种植';}}农场园丁也是系统的一部分,自然应该由一个合适的类来代表。这个类是水果园丁类,它的结构由下面的类图描述。

水果园丁类会根据客户端的要求,创建出不同的水果对象,比如苹果(苹果),葡萄(葡萄)或草莓(草莓)的实例。而如果接到不合法的要求水果园丁类会抛出坏果例外异常。园丁类的源代码如下所示。代码清单5:水果园丁类的源代码

班级水果园丁{ public static function factory($ what){ $ what=strtolow($ what);if($哪个=='苹果'){ 0返回新的apple();} else if($哪个=='草莓){返回新的草莓();} else if($哪个=='葡萄){返回新的Grip();} else {抛出新的badostoexception(' badostoexception ');}}}可以看出,园丁类提供了一个静态工厂方法。在客户端的调用下,这个方法创建客户端所需要的水果对象。如果客户端的请求是系统所不支持的,工厂方法就会抛出一个坏果例外异常。这个异常类的源代码如下所示。代码清单6:坏果例外类的源代码

类坏果例外扩展了异常{}在使用时,客户端只需调用水果园丁的静态方法工厂()即可。请见下面的示意性客户端源代码。代码清单7:怎样使用异常类坏果例外

试试{水果园丁:工厂('苹果');水果园丁:工厂("葡萄");水果园丁:工厂("草莓");//.} catch(badostoexception $ e){//.}这样,农场一定会百果丰收啦!

3.使用简单工厂模式设计一个"面向对象的"计算器

/** * 面向对象计算器* 思路: * 1、面向对象的基本,封装、继承、多太* 2、父类公用类* 3、各种运算类*//** * 基类,运算类* 只提供基本数据,不参与运算*/类操作{ //第一个数public $ first _ num=0;//第二个数public $ second _ num=0;/** * 获取结果,其他类覆盖此方法* @返回双倍$结果*/公共函数getResult(){ $ result=0.00;返回$ result}} /** *加法类*/类操作添加扩展操作{ /** *覆盖父类,实现加法算法*/public函数getResult(){ $ result=0;返回$ this-first _ num $ this-second _ num;}} /** * 减法类* */类操作潜水艇扩展操作{ /** *覆盖父类,实现加法算法*/public函数getResult(){ $ result=0;返回$ this-first _ num-$ this-second _ num;}} /** * 乘法类* */类操作米尔扩展操作{ /** *覆盖父类,实现加法算法*/public函数getResult(){ $ result=0;返回$ this-first _ num * $ this-second _ num;}} /** * 除类* */类OperationDiv扩展操作{ /** *覆盖父类,实现加法算法*/public函数getResult(){ $ result=0;if($ this-second _ num==0){ 0引发新的异常('除法操作第二个参数不能为零!');返回0;}返回$ this-first _ num/$ this-second _ num;}} /** * 工厂类*/class OperationFactory { /** *工厂函数* @ param string $ operation * @ return object */public function createOperation($ operation){ $ oper=null;switch($ operation){ case ' ' : $ oper=new operation add();打破;case '-' : $ oper=new OperatiOnSub();打破;大小写* " : $ oper=新操作mul();打破;case '/' : $ oper=new operation div();打破;默认值:返回0;}返回$ oper } } $ operation=new operation factory();$ oper=$ operation-create operation('/');$ oper-first _ num=10;$ oper-sec _ num=20;var _ dump($ oper-GetResult());201622993823532.jpg  (780328)

版权声明:示例说明PHP设计模式编程中的工厂方法模式是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。