• 售前

  • 售后

热门帖子
入门百科

PHP筹划模式之工厂模式界说与用法详解

[复制链接]
123457044 显示全部楼层 发表于 2021-10-25 19:31:33 |阅读模式 打印 上一主题 下一主题
本文实例陈诉了PHP设计模式之工厂模式界说与用法。分享给各人供各人参考,详细如下:
工厂模式(Factory Design Pattern)作为一种创建型设计模式, 遵循了开放-封闭原则, 对修改封闭, 对扩展开放. 工厂方法(Factory Method)模式就是要创建"某种东西". 对于工厂方法模式, 要创建的"东西"是一个产品,这个产品与创建它的类之间不存在绑定.实际上,为了保持这种松耦合,客户会通过一个工厂发出哀求. 再由工厂创建所哀求的产品.也可以换种方式考虑, 使用工厂方法模式, 哀求者只发出哀求, 而不详细创建产品.
工厂的工作
先创建一个工厂的接口
Factory.php
  1. <?php
  2. abstract class Factory
  3. {
  4. //抽象的创建对象的方法
  5. protected abstract function createProduct();
  6. //该方法调用createProduct方法返回一个产品对象.
  7. public function start()
  8. {
  9.    return $this->createProduct();
  10. }
  11. }
复制代码
  1. start
复制代码
方法返回一个产品,该方法调用
  1. createProduct
复制代码
方法完成产生产品的操纵.以是createProduct的详细实现要构建并返回一个按Product接口实现的产品对象.
好比产品都有一个共同的方法
  1. getProperties()
复制代码
, 以下是对应Product接口
Product.php
  1. <?php
  2. //产品接口
  3. interface Product
  4. {
  5. public function getProperties();
  6. }
复制代码
接着, 我们要创建两个工厂,文本工厂TextFactory和图像工厂phptoFactory
TextFactory.php
  1. <?php
  2. include_once('Factory.php');
  3. include_once('TextProduct.php');
  4. class TextFactory extends Factory
  5. {
  6. protected function createProduct()
  7. {
  8.   $product = new TextProduct();
  9.   return $product->getProperties();
  10. }
  11. }
复制代码
PhotoFactory.php
  1. <?php
  2. include_once('Factory.php');
  3. include_once('PhotoProduct.php');
  4. class PhotoFactory extends Factory
  5. {
  6. protected function createProduct()
  7. {
  8.   $product = new PhotoProduct();
  9.   return $product->getProperties();
  10. }
  11. }
复制代码
可以看到,在工厂方法的实现中, getProperties方法引入了多态(polymorphism), 将用这个方法返回"文本"或"图像". 同一个
  1. getProperties()
复制代码
有多个(poly)差异的形态(morphs), 这就是多态.在这种情况下, 此中一种形式返回文本, 而另一种返回图像.
可以在properties这个实现中放入你想要的任何东西,工厂方法设计将会创建这个对象, 并把他返回给Client使用.
下面的是两个产品的实现
TextProduct.php
  1. <?php
  2. include_once('Product.php');
  3. class TextProduct implements Product
  4. {
  5. public function getProperties()
  6. {
  7.   return "这里是文本产品";
  8. }
  9. }
复制代码
PhotoProduct.php
  1. <?php
  2. include_once('Product.php');
  3. class PhotoProduct implements Product
  4. {
  5. //这是产品具有的方法
  6. public function getProperties()
  7. {
  8.   return "这里是图像产品";
  9. }
  10. }
复制代码
这两个产品实现了Product接口中的抽象方法
  1. getProperties()
复制代码
,
客户(Client)
我们并不希望客户直接做出产品哀求.实际上, 我们希望客户通过Factory工厂接口做出哀求.如许一来,如果以后我们增加了产品大概工厂, 客户可以做同样的哀求来得到更多类型的产品 , 而不会粉碎这个应用:
Client.php
  1. <?php
  2. include_once('PhotoFactory.php');
  3. include_once('TextFactory.php');
  4. class Client
  5. {
  6. public function __construct()
  7. {
  8.   $this->somePhotoObject = new PhotoFactory();
  9.   echo $this->somePhotoObject->start() . '<br />';
  10.   $this->someTextObject = new TextFactory();
  11.   echo $this->someTextObject->start() . '<br />';
  12. }
  13. }
  14. $worker = new Client();
复制代码
运行Client.php, 得到下面的结果
  1. 这里是图像产品
  2. 这里是文本产品
复制代码
注意: Client对象并没有向产品直接做出哀求, 而是通过工厂来哀求. 紧张的是, 客户并不实现产品特性, 而留给产品实现来体现.
调整产品
设计模式的真正代价并不是提高操纵的速率, 而是加快开辟的速率.
如果现在需求厘革了, 需要对图像产品做出修改, 只需要修改相应的产品PhotoProduct的getProperties方法即可
对象的改变看起来很简单 不过Product的
  1. getProperties()
复制代码
方法仍保持相同的接口,哀求工厂返回一个属性对象
增加新产品和参数化哀求
题目来了,如果要增加更多的图像和文本说明, 有没有须要每次增加一个新的区域就增加一个新的详细的工厂类?这意味着要为每个新区域增加一个新工厂和产品.于是,我们引进了参数化工厂设计模式
参数化工厂设计模式和一般的工厂设计模式的主要区别之一是客户包罗工厂和产品的引用. 在参数化哀求中, Client类必须指定产品, 而不是产品工厂.
  1. createProduct()
复制代码
操纵中的参数是由客户传入一个产品; 以是客户必须指出它想要的详细产品. 不过, 这个哀求仍然是通过工厂接口Factory发出的. 以是, 只管客户包罗一个产品引用, 但通过Factory, 客户仍然与产品分离.
一个工厂多个产品(参数化工厂方法)
对于大多数哀求, 参数化工厂方法更为简单, 由于客户只需要处置惩罚一个详细工厂.工厂方法操纵有一个参数,指示需要创建的产品.而在原来的设计中, 每个产品都有自己的工厂, 不需要另个通报参数; 产品实现依赖于各个产品特定的工厂.
新工厂接口
Factory.php
  1. <?php
  2. abstract class Factory
  3. {
  4. //抽象的创建对象的方法
  5. protected abstract function createProduct(Product $product);
  6. //该方法由factoryMethod方法返回一个产品对象.
  7. public function start($product)
  8. {
  9.    return $this->createProduct($product);
  10. }
  11. }
复制代码
在这个新的Factory接口中可以看到,
  1. create()
复制代码
  1. start()
复制代码
都需要一个参数,指定一个Product对象, 而不是Product接口的一个特定实现, 以是可以继承任何Product的详细实例.
工厂详细实现
详细的创建者类CommonFactory实现了
  1. createProduct()
复制代码
,如下
CommonFactory.php
  1. <?php
  2. include_once('Factory.php');
  3. include_once('Product.php');
  4. class CommonFactory extends Factory
  5. {
  6. protected function createProduct(Product $product)
  7. {
  8.   return $product->getProperties();
  9. }
  10. }
复制代码
这个类调用Product的方法getProperties将产品返回给客户.
新产品
详细产品的厘革并不会改变原来的Product接口,还是原来的代码
  1. <?php
  2. //产品接口
  3. interface Product
  4. {
  5. public function getProperties();
  6. }
复制代码
比方, 现在有一个钢笔产品PenProduct
PenProduct.php
  1. <?php
  2. include_once('Product.php');
  3. class PenProduct implements Product
  4. {
  5. public function getProperties()
  6. {
  7.   return "钢笔产品";
  8. }
  9. }
复制代码
客户Clent(有参数)
  1. <?php
  2. include_once('CommonFactory.php');
  3. include_once('PenProduct.php');
  4. class Client
  5. {
  6. public function __construct()
  7. {
  8.   $commonFactory = new CommonFactory();
  9.   echo $commonFactory->start(new PenProduct());
  10. }
  11. }
  12. $worker = new Client();
复制代码
运行后输出
  1. 钢笔产品
复制代码
以后如果开辟出了新的产品, 只需要创建对应的产品类, 然后客户指定想要的新产品 , 即可返回客户需要的产品.
总结:
产品改变: 接口稳定
使用设计模式的一大利益就是可以很容易地对类做出改变, 而不会粉碎更大的步伐. 之以是能够容易地做出改变, 法门在于保持接口稳定, 而只改变内容.
更多关于PHP相关内容感爱好的读者可检察本站专题:《php面向对象步伐设计入门教程》、《PHP根本语法入门教程》、《PHP数组(Array)操纵技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操纵入门教程》及《php常见数据库操纵技巧汇总》
希望本文所述对各人PHP步伐设计有所资助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作