php-工厂模式实现
概述
工厂模式(Factory Pattern):在工厂模式中,可以根据参数的不同返回不同类的实例。工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
还是拿工厂模式现实中中的例子:
现在有一个摩托车制造厂,它生产踏板摩托和跨骑摩托车,踏板车和跨骑车都是由发动机、车身和轮子组成的。
在工厂模式中,我们把踏板摩托车和跨骑摩托车作为摩托族群中的两个类别,生产引擎、车身和轮子为生产摩托车的固定结构,
模式结构
工厂模式包含如下角色:
- MotorcycleFactory-摩托工厂角色:工厂角色负责实现创建所有实例的内部逻辑
- Motorcycle:抽象摩托角色:摩托角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
- MotorcycleScooter-踏板摩托角色:具体实现踏板摩托车的业务逻辑
- MotorcycleStraddle-跨骑摩托角色:具体实现跨骑摩托车的业务逻辑
UML图例
以本文实例代码为参考
代码实例
<?php
/**
* +----------------------------------------------------------------------+
* php23种设计模式实现-工厂模式
* Author:微信公众号:yuantanphp
* 获取更多资源,技术答疑,项目合作请关注微信公众号:yuantanphp
* +----------------------------------------------------------------------+
*/
//定义一个抽象类
abstract class Motorcycle
{
//发动方法
public abstract function engine();
//车身方法
public abstract function body();
//车轮方法
public abstract function whell();
}
/**
* 踏板摩托
*/
class MotorcycleScooter extends Motorcycle
{
public function engine()
{
return "MotorcycleScooter-engine";
// return "this is Product".$this->product_name;
}
public function body(){
return "MotorcycleScooter-body";
}
public function whell(){
return "MotorcycleScooter-whell";
}
}
/**
* 跨骑摩托
*/
class MotorcycleStraddle extends Motorcycle
{
public function engine()
{
return "MotorcycleStraddle-engine";
}
public function body(){
return "MotorcycleStraddle-body";
}
public function whell(){
return "MotorcycleStraddle-whell";
}
}
//摩托工厂类
class MotorcycleFactory
{
//创建保存示例的静态成员变量
private static $obj;
//创建产品
public static function createMotorcycle(string $type)
{
switch ($type) {
case 'Scooter':
self::$obj = new MotorcycleScooter();
break;
case 'Straddle':
self::$obj = new MotorcycleStraddle();
break;
default:
throw new Exception("不能生产的摩托车类型");
break;
}
//最后返回这个实例
return self::$obj;
}
}
//最后我们使用工厂模式
//跨骑车
$obj = MotorcycleFactory::createMotorcycle('Straddle');
$motoCycleStraddle = array();
$motoCycleStraddle["engine"] = $obj->engine();
$motoCycleStraddle["body"] = $obj->body();
$motoCycleStraddle["whell"] = $obj->whell();
//踏板车
$obj = MotorcycleFactory::createMotorcycle('Scooter');
$motoCycleScooter = array();
$motoCycleScooter["engine"] = $obj->engine();
$motoCycleScooter["body"] = $obj->body();
$motoCycleScooter["whell"] = $obj->whell();
echo "踏板摩托车<br>";
var_dump($motoCycleScooter);
echo "<br>";
echo "跨骑摩托车<br>";
var_dump($motoCycleStraddle);
模式分析
- 将对象的创建和对象业务逻辑处理分离可以降低代码的耦合度,使得两者修改起来相对容易。
- 工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。
- 工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
模式优点
- 工厂类含有必有的判断的逻辑,客户端可以根据自身所需传入对应的参数得到对应的对象。
- 客户端无需知道具体产品类的类名,只需要知道对应所需的参数的即可。
模式缺点
- 工厂类由于使用了静态工厂方法,造成了工厂角色无法形成继承的等级结构。
- 由于工厂类集中了众多产品创建逻辑,一旦工厂类出错,则对应的所有产品都会出错。
- 系统拓展困难,一旦添加新产品不得不修改工厂逻辑,在产品类型过多时。不利于系统的拓展和维护。
适用环境
在以下情况下可以使用简单工厂模式:
- 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
关注微信公众号(yuantanphp) | |
---|---|
回复关键字 设计模式 可获取以下材料 《设计模式:可复用面向对象软件的基础》pdf版. php设计模式23种实例实现php源码 |