千家信息网

PHP设计模式中工厂模式的示例分析

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,小编给大家分享一下PHP设计模式中工厂模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简单工厂模式是类的创建模
千家信息网最后更新 2024年11月19日PHP设计模式中工厂模式的示例分析

小编给大家分享一下PHP设计模式中工厂模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例。

1.工厂模式的几种形态
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:
(1)简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern)。
(2)工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式;
(3)抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式。下面就是简单工厂模式的简略类图。

简单工厂模式,或称静态工厂方法模式,是不同的工厂方法模式的一个特殊实现。在其他文献中,简单工厂往往作为普通工厂模式的一个特例讨论。
学习简单工厂模式是对学习工厂方法模式的一个很好的准备,也是对学习其他模式,特别是单例模式和多例模式的一个很好的准备。

2 .简单工厂模式的引进

比如说有一个农场公司,专门向市场销售各类水果。在这个系统里需要描述下列的水果:
葡萄 Grape
草莓 Strawberry
苹果 Apple
水果与其他的植物有很大的不同,就是水果最终是可以采摘食用的。那么一个自然的作法就是建立一个各种水果都适用的接口,以便与农场里的其他植物区分开。如下图所示。

水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法:种植plant(),生长grow()以及收获harvest()。接口Fruit 的类图如下所示。

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

interface Fruit{public function grow();public function harvest();public function plant();}

Apple 类是水果类的一种,因此它实现了水果接口所声明的所有方法。另外,由于苹果是多年生植物,因此多出一个treeAge 性质,描述苹果树的树龄。下面是这个苹果类的源代码。
代码清单2:类Apple 的源代码

class Apple implements Fruit{private $_treeAge;public function grow(){echo "Apple is growing.";}public function harvest(){echo "Apple has been harvested.";}public function plant(){echo "Apple has been planted.";}public function getTreeAge(){return $this->_treeAge;}public function setTreeAge($treeAge){$this->_treeAge = (int) $treeAge;}}

同样,Grape 类是水果类的一种,也实现了Fruit 接口所声明的所有的方法。但由于葡萄分有籽和无籽两种,因此,比通常的水果多出一个seedless 性质,如下图所示。

葡萄类的源代码如下所示。可以看出,Grape 类同样实现了水果接口,从而是水果类型的一种子类型。
代码清单3:类Grape 的源代码

class Grape implements Fruit{private $seedless;public function grow(){echo "Grape is growing.";}public function harvest(){echo "Grape has been harvested.";}public function plant(){echo "Grape has been planted.";}public function getSeedless(){return $this->seedless;}public function setSeedless($seedless){$this->seedless = (boolean) $seedless;}}

Strawberry 类实现了Fruit 接口,因此,也是水果类型的子类型,其源代码如下所示。
代码清单4:类Strawberry 的源代码

class Strawberry implements Fruit{public function grow(){echo "Strawberry is growing.";}public function harvest(){echo "Strawberry has been harvested.";}public function plant(){echo "Strawberry has been planted.";}}

农场的园丁也是系统的一部分,自然要由一个合适的类来代表。这个类就是FruitGardener 类,其结构由下面的类图描述。

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

class FruitGardener{public static function factory($which){$which = strtolower($which);if ($which == 'apple') {return new Apple();} elseif ($which == 'strawberry') {return new Strawberry();} elseif ($which == 'grape') {return new Grape();} else {throw new BadFruitException('Bad fruit request');}}}

可以看出,园丁类提供了一个静态工厂方法。在客户端的调用下,这个方法创建客户端所需要的水果对象。如果客户端的请求是系统所不支持的,工厂方法就会抛出一个BadFruitException 异常。这个异常类的源代码如下所示。
代码清单6:BadFruitException 类的源代码

class BadFruitException extends Exception{}

在使用时,客户端只需调用FruitGardener 的静态方法factory()即可。请见下面的示意
性客户端源代码。
代码清单7:怎样使用异常类BadFruitException

try {FruitGardener::factory('apple');FruitGardener::factory('grape');FruitGardener::factory('strawberry');//...} catch (BadFruitException $e) {//...}

这样,农场一定会百果丰收啦!

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

/** * 面向对象计算器 * 思路: * 1、面向对象的基本,封装、继承、多太 * 2、父类公用类 * 3、各种运算类 */ /** * 基类,运算类 * 只提供基本数据,不参与运算 */ class Operation {   // 第一个数 public $first_num = 0;   // 第二个数 public $second_num = 0;   /**  * 获取结果,其他类覆盖此方法  * @return double $result  */ public function getResult() {  $result = 0.00;     return $result; }} /** * 加法类 */class OperationAdd extends Operation { /**  * 覆盖父类,实现加法算法  */ public function getResult() {  $result = 0;  return $this->first_num + $this->second_num; }} /** * 减法类 * */class OperationSub extends Operation { /**  * 覆盖父类,实现加法算法  */ public function getResult() {  $result = 0;  return $this->first_num - $this->second_num; }} /** * 乘法类 * */class OperationMul extends Operation { /**  * 覆盖父类,实现加法算法  */ public function getResult() {  $result = 0;  return $this->first_num * $this->second_num; }} /** * 除类 * */class OperationDiv extends Operation { /**  * 覆盖父类,实现加法算法  */ public function getResult() {  $result = 0;     if ($this->second_num == 0) {   throw new Exception('除法操作第二个参数不能为零!');   return 0;  }     return $this->first_num / $this->second_num; }} /** * 工厂类 */class OperationFactory { /**  * 工厂函数  * @param string $operation  * @return object  */ public function createOperation($operation) {  $oper = null;     switch($operation) {   case '+':    $oper = new OperationAdd();    break;   case '-':    $oper = new OperationSub();    break;   case '*':    $oper = new OperationMul();    break;   case '/':    $oper = new OperationDiv();    break;   default:    return 0;  }  return $oper; }}  $operation = new OperationFactory();$oper = $operation->createOperation('/'); $oper->first_num = 10;$oper->second_num = 20;var_dump($oper->getResult());

以上是"PHP设计模式中工厂模式的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

模式 工厂 水果 方法 源代码 接口 代码 清单 客户 对象 加法 实例 苹果 静态 农场 就是 算法 类型 葡萄 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 桌面软件开发内嵌浏览器 数据库软件和财务app一样吗 公司需要养着一个软件开发团队吗 传奇物品数据库 宝石 深圳一容软件开发学校 我的世界如何带光影进服务器 网络安全产品名单 云霄县之远网络技术服务部 互联网的科技与商业思维 世界最顶尖的网络安全专家 中国创新成果数据库 应征入伍无法连接服务器 泗洪进口网络技术价格表格 兰州网络安全工程师等级 数据库数据的完整性包括哪三种 桃源天气预报软件开发 杨浦区信息软件开发管理方法 直销 软件开发 避免 服务器安装天擎后卸载无写入权限 莱州朗东网络技术有限公司 软件开发企业需要的营业许可证 华为hg8245打印服务器设置 小区中的网络安全问题 网络安全手抄报怎样做 网络安全李忠宇 软件开发合同开什么票 数据库数据的完整性包括哪三种 c 类操作数据库 计算机网络技术数据库运维 网络安全六条路线
0