我理解的抽象工厂模式其实就是为对象提供创建接口,调用创建接口就能得到想要的对象。
举例:
比如说需要图片和文本转换类,传如文本内容获取图片路径和名称,需要得到图片(或文本)的html标签或者是图片(或文本)的json_decode数据,在如下图的抽象工厂模式中,我们只需要调用业务工厂类(HtmlFactory或JsonFactory)里面的方法即可得到你想要得到的业务类。
UML类图
代码体现
AbstractFactory.php 抽象工厂类
<?php
namespace app\admin\pattern;
/**
* 抽象工厂类
* Class AbstractFactory
* @package app\admin\pattern
*/
abstract class AbstractFactory
{
/**
* 创建文本
* @param $content
* @return mixed
*/
abstract public function createText(string $content);
/**
* 创建图片
* @param string $path
* @param string $name
* @return mixed
*/
abstract public function createPicture(string $path, string $name='');
}
HtmlFactory.php 工厂类
<?php
namespace app\admin\pattern;
use app\admin\pattern\html\PictureHtml;
use app\admin\pattern\html\TextHtml;
/**
* html工厂类
* Class HtmlFactory
* @package app\admin\pattern
*/
class HtmlFactory extends AbstractFactory
{
/**
* 创建文本
* @param string $content
* @return TextHtml|mixed
*/
public function createText(string $content)
{
return new TextHtml($content);
}
/**
* 创建图片
* @param string $path
* @param string $name
* @return PictureHtml|mixed
*/
public function createPicture(string $path, string $name = '')
{
return new PictureHtml($path, $name);
}
}
JsonFactory.php 工厂类
<?php
namespace app\admin\pattern;
use app\admin\pattern\json\PictureJson;
use app\admin\pattern\json\TextJson;
/**
* json工厂类
* Class JsonFactory
* @package app\admin\pattern
*/
class JsonFactory extends AbstractFactory
{
/**
* 创建文本
* @param string $content
* @return TextJson|mixed
*/
public function createText(string $content)
{
return new TextJson($content);
}
/**
* 创建图片
* @param string $path
* @param string $name
* @return PictureJson|mixed
*/
public function createPicture(string $path, string $name = '')
{
return new PictureJson($path, $name);
}
}
MediaInterface.php 业务接口类
<?php
namespace app\admin\pattern;
/**
* 业务接口类
* Interface MediaInterface
* @package app\admin\pattern
*/
interface MediaInterface
{
public function render();
}
Text.php 文本抽象类
<?php
namespace app\admin\pattern;
/**
* 文本抽象类
* Class Text
* @package app\admin\pattern
*/
abstract class Text implements MediaInterface
{
/**
* @var string
*/
protected $text;
public function __construct($text)
{
$this->text = $text;
}
}
Picture.php 图片抽象类
<?php
namespace app\admin\pattern;
/**
* 图片抽象类
* Class Picture
* @package app\admin\pattern
*/
abstract class Picture implements MediaInterface
{
/**
* @var string
*/
protected $path;
/**
* @var string
*/
protected $name;
public function __construct($path, $name = '')
{
$this->path = $path;
$this->name = $name;
}
}
TextHtml.php 文本html业务实现类
<?php
namespace app\admin\pattern\html;
use app\admin\pattern\Text;
/**
* 文本html实现业务类
* Class TextHtml
* @package app\admin\pattern\html
*/
class TextHtml extends Text
{
public function render()
{
return '<div>' . htmlspecialchars($this->text) . '</div>';
}
}
PictureHtml.php 图片业务实现类
<?php
namespace app\admin\pattern\html;
use app\admin\pattern\Picture;
/**
* 图片html业务实现类
* Class PictureHtml
* @package app\admin\pattern\html
*/
class PictureHtml extends Picture
{
public function render()
{
return sprintf('<img src="%s" title="%s"/>', $this->path, $this->name);
}
}
TextJson.php 文本json实现类
<?php
namespace app\admin\pattern\json;
use app\admin\pattern\Text;
/**
* 文本json实现类
* Class TextJson
* @package app\admin\pattern\json
*/
class TextJson extends Text
{
public function render()
{
return json_encode(['content' => $this->text]);
}
}
PictureJson.php 图片json实现类
<?php
namespace app\admin\pattern\json;
use app\admin\pattern\Picture;
/**
* 图片json实现类
* Class PictureJson
* @package app\admin\pattern\json
*/
class PictureJson extends Picture
{
public function render()
{
return json_encode(['title' => $this->name, 'path' => $this->path]);
}
}