设计模式之工厂模式
2018-09-06 本文已影响0人
6f748fe54ad4
开发过程当中,会遇到一些比较典型的场景,理解好这些典型场景,能够让我们在实现功能前,心中有框架,手上有工具,更好地开发产品。
一. 介绍
1.1 工厂模式就是要创建某种东西,“东西”可以理解为产品,这个产品和创建它的类不存在绑定关系,是一种松耦合。一般情况下,客户端会向工厂发出请求,由工厂创建所请求产品。当我们实例化对象的子类可能变化时,就要使用工厂模式。
创建对象的子类数目已知时,采用可预测方式制定数目。比如,开发世界地图时,不同对象表示七大洲,这就是数目固定的;
创建对象的子类数目未知时,程序必要要灵活。比如,统计图书馆中图书的类别时,可能会不断的发现有新的类别,或者之前的类别无法满足后续的需求,要被撤掉,要充分考虑到这种情况;
处理上面两种情况,此时就可以考虑使用工厂模式。
二.原理
实现的工厂方法类图
捕获.PNGclient类是隐含的
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();
客户通过特定产品工厂的工厂接口做出一个请求,请求中包含参数,指明要请求的产品内容。
总结
开发过程中,与其尝试让任意数目的类和对象都保持不变,不如保持接口不变更为容易。使用工厂模式可以简化复杂的创建过程,关键就在于它会维持一个公用接口。