什么是工厂方法模式?

  • 顾名思义:在工厂模式的基础上,对工厂类里耦合的业务判断进行了二次拆分解耦,每个产品类型有了自己独立的工厂实现。

应用场景

  • 1、实现对工厂模式的升级,降低工厂类的业务复杂度

注意事项

  • 随着业务复杂度提升,需要谨慎考虑是否该使用此模式。
  • 工厂方法模式是抽象了工厂类,每个产品线会有独立的工厂实现,若真实业务场景里的某个产品线未来会有修改功能,那么工厂类的变更将会相当麻烦。

具体实现

  • 实例场景:在宝马工厂中,会生产各种型号的车辆。各个4S店每天都要从工厂下订单。
  • 工厂对于每个型号车辆的生产(实现),交给对应的子工厂来生产。
  • UML图(图片引用自网络)

代码实例

BMWFactory.php (工厂抽象接口)

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

/**
 * 宝马工厂接口
 *
 * @author woodhead
 * @date 2023年11月21日20:22:40
 */
interface BMWFactory
{
    /**
     * 工厂生产抽象方法
     * @return BMW
     */
    public function create();
}

BMW.php (产品抽象接口)

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

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

BMW320Factory.php(执行生产的工厂-接口实现)

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

class BMW320Factory implements BMWFactory
{
    /**
     * 宝马320工厂生产方法
     * - 注意,生产的结果一定是宝马产品接口实例
     * - PHP语言限制,此处显式声明为BMW
     * @return BMW
     */
    public function create()
    {
        return new BMW320();
    }
}

BMW523Factory.php(执行生产的工厂-接口实现)

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

class BMW523Factory implements BMWFactory
{
    /**
     * 宝马523工厂生产方法
     * - 注意,生产的结果一定是宝马产品接口实例
     * - PHP语言限制,此处显式声明为BMW
     * @return BMW
     */
    public function create()
    {
        return new BMW523();
    }
}

BMW320.php(产品组装车间-产品接口实现)

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

/**
 * BMW320生产车间
 * - 注意,区别于简单工厂模式,这里已经升级为具体某个子工厂的车间
 */
class BMW320 implements BMW
{

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

BMW523.php(产品组装车间-产品接口实现)

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

/**
 * BMW320生产工厂
 * - 注意,区别于简单工厂模式,这里已经升级为具体某个子工厂的车间
 */
class BMW523 implements BMW
{

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

test.php

<?php
require_once('../../../../autoloader.php');
use com\wdqz\factory\functional\BMW320Factory;
use com\wdqz\factory\functional\BMW523Factory;

$bmw320Factory = new BMW320Factory;
$bmw320 = $bmw320Factory->create();
echo $bmw320->build();

$bmw523Factory = new BMW523Factory;
$bmw523 = $bmw523Factory->create();
echo $bmw523->build();

效果:

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