专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

php工厂模式是什么,php工厂模式怎么用

来源:小易整编  作者:小易  发布时间:2023-02-23 05:45
摘要:php工厂模式是什么,php工厂模式怎么用工厂模式(FactoryDesignPattern)作为一种创建型设计模式,遵循了开放-封闭原则,对修改封闭,对扩展开放.工厂方法(FactoryMethod)模式就是要创建某种东西.对于工厂方...

php工厂模式是什么,php工厂模式怎么用

工厂模式(Factory Design Pattern)作为一种创建型设计模式, 遵循了开放-封闭原则, 对修改封闭, 对扩展开放. 工厂方法(Factory Method)模式就是要创建"某种东西".

php工厂模式是什么,php工厂模式怎么用

对于工厂方法模式, 要创建的"东西"是一个产品,这个产品与创建它的类之间不存在绑定.实际上,为了保持这种松耦合,客户会通过一个工厂发出请求. 再由工厂创建所请求的产品.也可以换种方式考虑, 利用工厂方法模式, 请求者只发出请求, 而不具体创建产品.

工厂的工作

先建立一个工厂的接口

Factory.php

<?php abstract class Factory { //抽象的创建对象的方法 protected abstract function createProduct(); //该方法调用createProduct方法返回一个产品对象. public function start() {   return $this->createProduct(); } }

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

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

Product.php

<?php //产品接口 interface Product { public function getProperties(); }

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

TextFactory.php

<?php include_once('Factory.php'); include_once('TextProduct.php'); class TextFactory extends Factory { protected function createProduct() {  $product = new TextProduct();  return $product->getProperties(); } }

PhotoFactory.php

<?php include_once('Factory.php'); include_once('PhotoProduct.php'); class PhotoFactory extends Factory { protected function createProduct() {  $product = new PhotoProduct();  return $product->getProperties(); } }

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

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

下面的是两个产品的实现

TextProduct.php

<?php include_once('Product.php'); class TextProduct implements Product { public function getProperties() {  return "这里是文本产品"; } }

PhotoProduct.php

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

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

客户(Client)

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

Client.php

<?php include_once('PhotoFactory.php'); include_once('TextFactory.php'); class Client { public function __construct() {  $this->somePhotoObject = new PhotoFactory();  echo $this->somePhotoObject->start() . '<br />';  $this->someTextObject = new TextFactory();  echo $this->someTextObject->start() . '<br />'; } } $worker = new Client();

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

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

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

调整产品

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

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

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

增加新产品和参数化请求

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

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

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

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

新工厂接口

Factory.php

<?php abstract class Factory { //抽象的创建对象的方法 protected abstract function createProduct(Product $product); //该方法由factoryMethod方法返回一个产品对象. public function start($product) {   return $this->createProduct($product); } }

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

工厂具体实现

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

CommonFactory.php

<?php include_once('Factory.php'); include_once('Product.php'); class CommonFactory extends Factory { protected function createProduct(Product $product) {  return $product->getProperties(); } }

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

新产品

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

<?php //产品接口 interface Product { public function getProperties(); }

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

PenProduct.php

<?php include_once('Product.php'); class PenProduct implements Product { public function getProperties() {  return "钢笔产品"; } }

客户Clent(有参数)

<?php include_once('CommonFactory.php'); include_once('PenProduct.php'); class Client { public function __construct() {  $commonFactory = new CommonFactory();  echo $commonFactory->start(new PenProduct()); } } $worker = new Client();

运行后输出

钢笔产品

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

总结:

产品改变: 接口不变

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


本文地址:百科问答频道 https://www.neebe.cn/wenda/903302.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • phpMyAdmin是什么意思?

    phpMyAdmin是什么意思?

    phpMyAdmin是一个用PHP编写的MySQL的管理界面程序,它通过Web浏览器实现MySQL的管理,操作MySQL数据库更加容易,不必使用命令行。phpMyAdmin的功能很强大,能实现MySQL的各种管理操作,能够执行SQ...

  • phpstorm怎么配置php环境,PhpStorm如何配置php的环境

    phpstorm怎么配置php环境,PhpStorm如何配置php的环境

    phpstorm怎么配置php环境,PhpStorm如何配置php的环境前言PhpStorm配置php环境前期准备下载并安装好PhpStorm软件下载php+apache并安装好,或者直接安装wamp、phpstudy等一键环境都是可以的确...

  • php下载安装教程,php下载安装详细介绍

    php下载安装教程,php下载安装详细介绍

    php下载安装教程,php下载安装详细介绍一、PHP环境安装流程  说明:最近在搭建个人网站,环境有用到PHP,特此记录。本文安装案例是以PHP8.0.0版本为示例,「开始安装前建议先将第三步骤抛出异常的依赖安装,这样安装的时候就无需逐个解...

  • 小偷程序源码,php小偷程序实例代码

    小偷程序源码,php小偷程序实例代码

    小偷程序源码,php小偷程序实例代码小偷程序其实就是利用了php中的一特定函数实现采集别人网站的内容,然后通过正则分析把我们想要的内容保存到自己本地数据库了,下面我来介绍php小偷程序的实现方法,有需要的朋友可参考。在下面采集数据过程中fi...

  • php四舍五入函数(php四舍五入方法)

    php四舍五入函数(php四舍五入方法)

    php四舍五入函数(php四舍五入方法)经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已~~主要是:ceil,floor,round,intval.一、ceil- 进一法取整floatceil(floatvalue)返回...

  • phpstudy怎么安装,phpstudy使用教程

    phpstudy怎么安装,phpstudy使用教程

    phpstudy怎么安装,phpstudy使用教程百度搜索phpstudy官网进行下载安装。配置我们在完成安装之后还不能马上进行正常的使用,我们打开刚安装好的php,点击启动WNMP,然后点击启动Apache和MySQL(我在点击启动WAM...

  • thinkphp框架漏洞总结

    thinkphp框架漏洞总结

    ThinkPHP框架漏洞总结Thinkphp简介ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPH...

  • php递归函数的例子,php递归函数用法详解

    php递归函数的例子,php递归函数用法详解

    php递归函数的例子,php递归函数用法详解,有关php递归函数的用法,分享几个php递归函数的例子,在php编程中,使用递归进行函数调用很常见,递归函数用的好,可以提高代码效率,通过例子学习php递归函数的使用。...

  • 周排行
  • 月排行
  • 年排行

精彩推荐