PHP设计模式之工厂模式定义与用法详解

本文实例讲述了PHP设计模式之工厂模式定义与用法分享给大家供大家参考,具体如下:

工厂模式(Factory Design Pattern)作为一种创建型设计模式,遵循了开放-封闭原则,对修改封闭,对扩展开放. 工厂方法(Factory Method)模式就是要创建"某种东西". 对于工厂方法模式,要创建的"东西"是一个产品,这个产品与创建它的类之间不存在绑定.实际上,为了保持这种松耦合,客户会通过一个工厂发出请求. 再由工厂创建所请求的产品.也可以换种方式考虑,利用工厂方法模式,请求者只发出请求,而不具体创建产品.

工厂的工作

先建立一个工厂的接口

Factory.PHP

rush:PHP;"> createProduct(); } }

start方法返回一个产品,该方法调用createProduct方法完成产生产品的操作.所以createProduct的具体实现要构建并返回一个按Product接口实现的产品对象.

比如产品都有一个共同的方法getProperties(),以下是对应Product接口

Product.PHP

rush:PHP;"> PHP //产品接口 interface Product { public function getProperties(); }

接着,我们要建立两个工厂,文本工厂TextFactory和图像工厂PHPtoFactory

TextFactory.PHP

rush:PHP;"> getProperties(); } }

PhotoFactory.PHP

rush:PHP;"> getProperties(); } }

可以看到,在工厂方法的实现中,getProperties方法引入了多态(polymorphism),将用这个方法返回"文本"或"图像". 同一个getProperties()有多个(poly)不同的形态(morphs),这就是多态.在这种情况下,其中一种形式返回文本,而另一种返回图像.

可以在properties这个实现中放入你想要的任何东西,工厂方法设计将会创建这个对象,并把他返回给Client使用.

下面的是两个产品的实现

TextProduct.PHP

rush:PHP;"> PHP include_once('Product.PHP'); class TextProduct implements Product { public function getProperties() { return "这里是文本产品"; } }

PhotoProduct.PHP

rush:PHP;"> PHP include_once('Product.PHP'); class PhotoProduct implements Product { //这是产品具有的方法 public function getProperties() { return "这里是图像产品"; } }

这两个产品实现了Product接口中的抽象方法getProperties(),

客户(Client)

我们并不希望客户直接做出产品请求.实际上,我们希望客户通过Factory工厂接口做出请求.这样一来,如果以后我们增加了产品或者工厂,客户可以做同样的请求来得到更多类型的产品,而不会破坏这个应用:

Client.PHP

rush:PHP;"> somePhotoObject = new PhotoFactory(); echo $this->somePhotoObject->start() . '
'; $this->someTextObject = new TextFactory(); echo $this->someTextObject->start() . '
'; } } $worker = new Client();

运行Client.PHP,得到下面的结果

这里是图像产品 这里是文本产品

注意:

Client对象并没有向产品直接做出请求,而是通过工厂来请求. 重要的是,客户并不实现产品特性,而留给产品实现来体现.

调整产品

设计模式的真正价值并不是提高操作的速度,而是加快开发的速度.

如果现在需求变化了,需要对图像产品做出修改,只需要修改相应的产品PhotoProduct的getProperties方法即可

对象的改变看起来很简单 不过Product的getProperties()方法仍保持相同的接口,请求工厂返回一个属性对象

增加新产品和参数化请求

问题来了,如果要增加更多的图像和文本说明,有没有必要每次增加一个新的区域就增加一个新的具体的工厂类?这意味着要为每个新区域增加一个新工厂和产品.于是,我们引进了参数化工厂设计模式

参数化工厂设计模式和一般的工厂设计模式的主要区别之一是客户包含工厂和产品的引用. 在参数化请求中,Client类必须指定产品,而不是产品工厂. createProduct()操作中的参数是由客户传入一个产品; 所以客户必须指出它想要的具体产品. 不过,这个请求仍然是通过工厂接口Factory发出的. 所以,尽管客户包含一个产品引用,但通过Factory,客户仍然与产品分离.

一个工厂多个产品(参数化工厂方法)

对于大多数请求,参数化工厂方法更为简单,因为客户只需要处理一个具体工厂.工厂方法操作有一个参数,指示需要创建的产品.而在原来的设计中,每个产品都有自己的工厂,不需要另个传递参数; 产品实现依赖于各个产品特定的工厂.

新工厂接口

Factory.PHP

rush:PHP;"> createProduct($product); } }

在这个新的Factory接口中可以看到,create()start()都需要一个参数,指定一个Product对象,而不是Product接口的一个特定实现,所以可以接受任何Product的具体实例.

工厂具体实现

具体的创建者类CommonFactory实现了createProduct(),如下

CommonFactory.PHP

rush:PHP;"> getProperties(); } }

这个类调用Product的方法getProperties将产品返回给客户.

新产品

具体产品的变化并不会改变原来的Product接口,还是原来的代码

rush:PHP;"> PHP //产品接口 interface Product { public function getProperties(); }

例如,现在有一个钢笔产品PenProduct

PenProduct.PHP

rush:PHP;"> PHP include_once('Product.PHP'); class PenProduct implements Product { public function getProperties() { return "钢笔产品"; } }

客户Clent(有参数)

rush:PHP;"> start(new PenProduct()); } } $worker = new Client();

运行后输出

钢笔产品

以后如果开发出了新的产品,只需要创建对应的产品类,然后客户指定想要的新产品,即可返回客户需要的产品.

总结:

产品改变: 接口不变

使用设计模式的一大好处就是可以很容易地对类做出改变,而不会破坏更大的程序. 之所以能够容易地做出改变,秘诀在于保持接口不变,而只改变内容.

更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《

希望本文所述对大家PHP程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用