什么是抽象工厂模式?

  • 这个模式不怎么容易理解,下面通过一个真实场景可能能更好的理解。
  • 如果要用一句话来概括此模式的作用,那就是:封装产品系列,强调对象内的产品一致性。

应用场景

  • 1、产品的生产需要多种零部件结合,需要使用此模式。

注意事项

  • 由于此模式的工厂接口中定义死了产品的零部件种类,会给后面产品的升级带来灾难性的维护。

具体实现

  • 实例场景:在宝马工厂中,生产的各种车型,依赖不同的组装配件。
  • 工厂接口定义宝马生产所需要的零件种类,然后工厂子类调用对应零部件类实现。
  • UML图(图片引用自网络)

代码实例

Engine.php(引擎配件接口)

<?php

namespace com\wdqz\factory\abstraction;


/**
 * 宝马产品接口
 *
 * @author woodhead
 * @date 2023年11月22日22:27:09
 */
interface Engine
{
    /**
     * 生产发动机
     * @return mixed
     */
    public function build();
}

Gearbox.php(变速箱配件接口)

<?php

namespace com\wdqz\factory\abstraction;

/**
 * 变速箱接口
 *
 * @author woodhead
 * @date 2023年11月22日22:30:10
 */
interface Gearbox
{
    /**
     * 生产变速箱
     * @return mixed
     */
    public function build();
}

BMWFactory.php(宝马工厂类接口)

<?php

namespace com\wdqz\factory\abstraction;

/**
 * 抽象工厂接口
 *
 * @author woodhead
 * @date 2023年11月22日22:25:37
 */
interface BMWFactory
{
    /**
     * 生产发动机
     * @return Engine
     */
    public function createEngine();

    /**
     * 生产变速箱
     * @return Gearbox
     */
    public function createGearbox();
}

Engine320.php(宝马320发动机生产实现)

<?php

namespace com\wdqz\factory\abstraction;

/**
 * 宝马320发动机生产实现
 */
class Engine320 implements Engine
{

    /**
     * 实现宝马320的发动机生产细节
     * @return String
     */
    public function build()
    {
        return '这里是BMW320发动机生产车间。'.PHP_EOL;
    }
}

Engine523.php(宝马523发动机生产实现)

<?php

namespace com\wdqz\factory\abstraction;

/**
 * 宝马523发动机生产实现
 */
class Engine523 implements Engine
{

    /**
     * 实现宝马523的发动机生产细节
     * @return String
     */
    public function build()
    {
        return '这里是BMW523发动机生产车间。'.PHP_EOL;
    }
}

Gearbox320.php(宝马320变速箱生产实现)

<?php

namespace com\wdqz\factory\abstraction;

/**
 * 宝马320变速性生产实现
 */
class Gearbox320 implements Gearbox
{

    /**
     * 320变速箱生产细节
     * @return String
     */
    public function build()
    {
        return '这里是BMW320变速箱生产车间。'.PHP_EOL;
    }
}

Gearbox523.php(宝马523变速箱生产实现)

<?php

namespace com\wdqz\factory\abstraction;

/**
 * 宝马523变速性生产实现
 */
class Gearbox523 implements Gearbox
{

    /**
     * 523变速箱生产细节
     * @return String
     */
    public function build()
    {
        return '这里是BMW523变速箱生产车间。'.PHP_EOL;
    }
}

BMW320Factory.php(宝马320工厂类实现-组装配件)

<?php

namespace com\wdqz\factory\abstraction;

/**
 * 宝马320工厂实现
 * - 面向用户,使用此类生产320配件
 *
 * @author woodhead
 * @date 2023年11月22日22:39:32
 */
class BMW320Factory implements BMWFactory
{
    /**
     * 生产320发动机
     * @return Engine
     */
    public function createEngine()
    {
         return new Engine320();
    }

    /**
     * 生产320变速箱
     * @return Gearbox
     */
    public function createGearbox()
    {
        return new Gearbox320();
    }
}

BMW523Factory.php(宝马523工厂类实现-组装配件)

<?php

namespace com\wdqz\factory\abstraction;

/**
 * 宝马523工厂实现
 * - 面向用户,使用此类生产523配件
 *
 * @author woodhead
 * @date 2023年11月22日22:39:32
 */
class BMW523Factory implements BMWFactory
{
    /**
     * 生产523发动机
     * @return Engine
     */
    public function createEngine()
    {
         return new Engine523();
    }

    /**
     * 生产523变速箱
     * @return Gearbox
     */
    public function createGearbox()
    {
        return new Gearbox523();
    }
}

测试

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

$bmw320Factory = new BMW320Factory;
$bmw320Engine = $bmw320Factory->createEngine();
$bmw320Gearbox = $bmw320Factory->createGearbox();
echo $bmw320Engine->build();
echo $bmw320Gearbox->build();

$bmw523Factory = new BMW523Factory;
$bmw523Engine = $bmw523Factory->createEngine();
$bmw523Gearbox = $bmw523Factory->createGearbox();
echo $bmw523Engine->build();
echo $bmw523Gearbox->build();

效果

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