原教程地址:https://laravelacademy.org/post/2471
1.创建一个大工厂(抽象工厂) 这里定义需要实现的方法或属性
<?php
namespace App\DesignPatterns\Creational\AbstractFactory;
abstract class AbstractFactory
{
/**
* 创建文本方法
* @param string $name
*/
abstract public function createText(string $name);
/**
* 创建图片方法
* @param string $path
* @param string $name
* @return mixed
*/
abstract public function createPicture(string $path, $name = '');
}
2.总工厂创建完毕后开始创建具体工厂,这里需要继承总工厂,并完成定义好的方法, 返回的Text和Picture对象是后面需要创建的具体产品
HtmlFactory类
<?php
namespace App\DesignPatterns\Creational\AbstractFactory;
use App\DesignPatterns\Creational\AbstractFactory\Html\Picture;
use App\DesignPatterns\Creational\AbstractFactory\Html\Text;
class HtmlFactory extends AbstractFactory
{
/**
* 实现文本方法
* @param string $name
* @return Text
*/
public function createText(string $name)
{
return new Text($name);
}
/**
* 实现图文方法
* @param string $path
* @param string $name
* @return Picture
*/
public function createPicture(string $path, $name = '')
{
return new Picture($path, $name);
}
}
JsonFactory类
<?php
namespace App\DesignPatterns\Creational\AbstractFactory;
use App\DesignPatterns\Creational\AbstractFactory\Json\Text;
use App\DesignPatterns\Creational\AbstractFactory\Json\Picture;
class JsonFactory extends AbstractFactory
{
/**
* 创建文本组件
* @param string $content
* @return Json\Text
*/
public function createText(string $content)
{
return new Text($content);
}
/**
* 创建图片组件
* @param $path
* @param string $name
* @return Json\Picture
*/
public function createPicture($path, $name = '')
{
return new Picture($path, $name);
}
}
3.(可选)不同工厂内部的逻辑很可能不一样,为了方便后续扩展我这里会创建一个Interface类来规定最终返回的方法
<?php
namespace App\DesignPatterns\Creational\AbstractFactory;
interface MediaInterface
{
/**
* Json或Html 输出未经处理的渲染
* @return mixed
*/
public function render();
}
4.(可选) 这里创建一个抽象类,通过构造方法将参数加载进来,这个类也是用与扩展
<?php
namespace App\DesignPatterns\Creational\AbstractFactory;
abstract class Text implements MediaInterface
{
/**
* @var string
*/
protected $text;
/**
* Text constructor.
* @param $content
*/
public function __construct($content)
{
$this->text = (string) $content;
}
}
5.最后就是在HtmlFactory返回的Text类,由于返回的是类,索引可以直接调用render来获取执行结果
<?php
namespace App\DesignPatterns\Creational\AbstractFactory\Json;
use App\DesignPatterns\Creational\AbstractFactory\Text as BaseText;
class Text extends BaseText
{
/**
* 格式化输出
* @return false|mixed|string
*/
public function render()
{
return json_encode([["content" => $this->text]]);
}
}
剩下没有截图的文件都是大同小异