介绍

  抽象工厂声明一个创建抽象产品对象的接口,通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类.

优缺点

优点

  当一个产品族中的多个对象被设计成一起工作时,能保证客户端始终只使用同一个产品族中的对象.

缺点

  产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的工厂里加代码,又要在具体的里面加代码.

演示

  以QQ皮肤套装为例.

定义套装接口

// 定义抽象套装接口
interface AbstractSuit
{
    // 获取套装配置
    function getSuit();

    // 定义背景
    function background();

    // 定义气泡
    function bubble();

    // 定义模型
    function model();
}

定义类实现套装接口

// 默认套装
class DefaultSuit implements AbstractSuit
{
    public function getSuit()
    {
        $this->background();
        $this->model();
        $this->bubble();
    }

    public function background()
    {
        echo '使用白色背景;';
    }

    public function bubble()
    {
        echo '使用蓝色气泡;';
    }

    public function model()
    {
        echo '使用蓝白气泡.';
    }
}

// 定义vip套装
class VipSuit implements AbstractSuit
{
    public function getSuit()
    {
        $this->background();
        $this->model();
        $this->bubble();
    }

    public function background()
    {
        echo '使用红色背景;';
    }

    public function bubble()
    {
        echo '使用红色气泡;';
    }

    public function model()
    {
        echo '使用红色气泡.';
    }
}

定义工厂接口

// 定义工厂接口
interface Factory
{
    function getConfig();
}

定义类实现工厂接口

// 默认工厂
class DefaultFactory implements Factory
{
    public function getConfig()
    {
        return new DefaultSuit();
    }
}

// vip工厂
class VipFactory implements Factory
{
    public function getConfig()
    {
        return new VipSuit();
    }
}

实现

// 获取默认套装
$default = (new DefaultFactory())->getConfig()->getSuit();
echo PHP_EOL;
// 获取vip套装
$vip = (new VipFactory())->getConfig()->getSuit();

// 结果输出
使用白色背景;使用蓝白气泡.使用蓝色气泡;
使用红色背景;使用红色气泡.使用红色气泡;% 
Last modification:March 7th, 2020 at 03:34 am