技术-php

设计模式之工厂模式

2018-09-06  本文已影响0人  6f748fe54ad4

开发过程当中,会遇到一些比较典型的场景,理解好这些典型场景,能够让我们在实现功能前,心中有框架,手上有工具,更好地开发产品。

一. 介绍

1.1 工厂模式就是要创建某种东西,“东西”可以理解为产品,这个产品和创建它的类不存在绑定关系,是一种松耦合。一般情况下,客户端会向工厂发出请求,由工厂创建所请求产品。当我们实例化对象的子类可能变化时,就要使用工厂模式。

创建对象的子类数目已知时,采用可预测方式制定数目。比如,开发世界地图时,不同对象表示七大洲,这就是数目固定的;
创建对象的子类数目未知时,程序必要要灵活。比如,统计图书馆中图书的类别时,可能会不断的发现有新的类别,或者之前的类别无法满足后续的需求,要被撤掉,要充分考虑到这种情况;

处理上面两种情况,此时就可以考虑使用工厂模式。

二.原理

实现的工厂方法类图

捕获.PNG
client类是隐含的

client类包含Creator 工厂接口的一个引用,用于请求图像或者文本产品。client类只负责发出请求,不实例化产品,由具体的工厂实例化所请求的产品对象。Creator负责在接收到请求后,指挥并下发这个请求到到具体的工厂类中,去实例化产品。

三.实现

3.1建立工厂:creator 接口
<?php
/**
 * Created by PhpStorm.
 * 工厂模式 工厂根据参数给出不同产品
 * User: zy
 * Date: 2018/9/6
 * Time: 12:24
 */
abstract class Creator
{
  protected abstract function factoryMethod(Product $product);

  public function doFactory($productNow)
  {
    $countryProduct = $productNow;
    $mfg = $this->factoryMethod($countryProduct);
    return $mfg;
  }
}

factoryMethod 和doFactory 都需要参数,接口接收参数,创建并返回不同的产品对象。

3.2创建产品

3.2.1产品接口

<?php
/**
 * Created by PhpStorm.
 * User: zy
 * Date: 2018/9/6
 * Time: 14:28
 */
interface Product
{
  public function getProperties();
}

产品接口,具体的产品对象必须有相同的接口。getProperties函数返回产品给客户。
3.2.2产品demo

<?php
/**
 * Created by PhpStorm.
 * User: zy
 * Date: 2018/9/6
 * Time: 14:30
 */
include_once('Product.php');
include_once('FormatHelper.php');
class KyrgyzstanProduct implements Product
{
  private $mfgProduct;
  private $countryTxt;
  private $formatHelper;

  public function getProperties()
  {
    $this->countryTxt = file_get_contents('test.txt');

    $this->formatHelper = new FormatHelper();
    $this->mfgProduct = $this->formatHelper->addTop();
    $this->mfgProduct.= <<<KYRGYZSTAN
    <img src="none.jpg">
    <p>$this->countryTxt</p>
KYRGYZSTAN;
;
    $this->mfgProduct .= $this->formatHelper->closeUp();
    return $this->mfgProduct;
  }
}

产品中输出了一个图片,以及一段文本。这里面包含一个辅助类FormatHelper,负责公共的html标签处理。

3.3 辅助类FormatHelper
 <?php
  /**
 * Created by PhpStorm. 辅助类
 * User: zy
 * Date: 2018/9/6
 * Time: 15:11
 */
class FormatHelper
{
   private $topper;
   private $bottom;

   public function addTop(){
        $this->topper = "<!doctype html><html xmlns=\"http://www.w3.org/1999/html\"><head>
            <link rel='stylesheet' type='text/css', href='product.css'>
            <meta charset='UTF-8'>
            <title>Map Factory</title>
            </head>";
        return $this->topper;
}
  public function closeUp(){
      $this->bottom = "</body></html>";
      $this->bottom;
  }
}
3.4 有参数的客户
<?php
/**
 * Created by PhpStorm. 客户
 * User: zy
 * Date: 2018/9/6
 * Time: 15:27
 */
include_once('KyrgyzstanProduct.php');
include_once('CountryFactory.php');

class Client{
    private $countryFactory;
    public function __construct()
    {
        $this->countryFactory = new CountryFactory();
        echo $this->countryFactory->doFactory(new       KyrgyzstanProduct());

      }
}
$worker = new Client();

客户通过特定产品工厂的工厂接口做出一个请求,请求中包含参数,指明要请求的产品内容。

总结

开发过程中,与其尝试让任意数目的类和对象都保持不变,不如保持接口不变更为容易。使用工厂模式可以简化复杂的创建过程,关键就在于它会维持一个公用接口。

上一篇下一篇

猜你喜欢

热点阅读