什么是工厂方法模式?
- 顾名思义:在工厂模式的基础上,对工厂类里耦合的业务判断进行了二次拆分解耦,每个产品类型有了自己独立的工厂实现。
应用场景
- 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
最后编辑:Wolf 更新时间:2023-11-27 23:47