什么是工厂模式?

  • 顾名思义:工厂是生产产品的一个空间,在工厂中制造、创造客户需要的东西。
  • 学术含义:程序设计中,对于类/对象调用者来说,他需要的对象,只需要给定一个条件即可生成,而不用关心对象的生成逻辑。

应用场景?

  • 1、数据库、支付
  • 2、为实现对象创建/使用的分离,提高设计灵活性

注意事项

  • 对象的创建集中在工厂类,适用于约2个以上产品分类的对象维护,2个以下纯属多余,而过多的对象同样会导致高复杂度,甚至影响整体稳定

具体实现

  • 实例场景:在宝马工厂中,会生产各种型号的车辆。各个4S店每天都要从工厂下订单。
  • 工厂每个型号车辆的生产(实现),交给对应的车间。
  • UML图(图片引用自网络)
  • Customer:4S店/顾客
  • BMWFactory:工厂类
  • BMW:宝马车(品牌名称相当于车辆的抽象)
  • BMW320:具体型号(品牌的具体实现)
  • BMW523:具体型号(品牌的具体实现)

代码实例

BMW.php

<?php
namespace com\wdqz\factory\simple;

/**
 * 宝马品牌抽象
 */
interface BMW
{
    /**
     * 生产抽象方法
     *
     * @return mixed
     */
    public function build();
}

BMW320.php

<?php

namespace com\wdqz\factory\simple;

/**
 * BMW320生产车间
 */
class BMW320 implements BMW
{

    /**
     * 实现父类的生产方法,真正的开始生产车辆
     * @return string
     */
    public function build()
    {
        return '这里是BMW320生产车间,已收到订单,开始生产.'.PHP_EOL;
    }
}

BMW523.php

<?php

namespace com\wdqz\factory\simple;

/**
 * BMW320生产车间
 */
class BMW523 implements BMW
{

    /**
     * 实现父类的生产方法,真正的开始生产车辆
     * @return string
     */
    public function build()
    {
        return '这里是BMW523生产车间,已收到订单,开始生产.'.PHP_EOL;
    }
}

BMWFactory.php

<?php

namespace com\wdqz\factory\simple;

class BMWFactory
{
    /**
     * 工厂类
     * - 负责生成对应型号的生产对象
     * - 由于PHP语言限制,在注释中显式声明返回值必须为BMW实例
     *
     * @param $type
     * @return BMW
     */
    public static function create($type = '')
    {
        switch ($type) {
            case '320':
                return new BMW320();
                break;
            case '523':
                return new BMW523();
                break;
        }
    }
}

test.php

<?php
require_once('../../../../autoloader.php');
use com\wdqz\factory\simple\BMWFactory;

$bmw320 = BMWFactory::create('320');
echo $bmw320->build();

$bmw523 = BMWFactory::create('523');
echo $bmw523->build();

效果

作者:Wolf  创建时间:2023-11-20 21:21
最后编辑:Wolf  更新时间:2023-11-27 23:47