php-抽象工厂模式实现
概述
抽象工厂模式(Abstract Factory):抽象工厂模式是对工厂模式的抽象,通俗来说,就是把工厂模式的结构分离出来成为能独立运行的个体。工厂模式请参考文章 《php-工厂模式实现》
还是拿工厂模式现实中中的例子:
现在有一个摩托车制造厂,它生产踏板摩托和跨骑摩托车,踏板车和跨骑车都是由发动机、车身和轮子组成的。
在工厂模式中,我们把踏板摩托车和跨骑摩托车作为摩托族群中的两个类别,生产引擎、车身和轮子为生产摩托车的固定结构,
在抽象工厂模式中,我们把摩托车生产所需引擎,车身,和轮子按踏板和跨骑摩托车独立分开制造,以便增加对摩托车所需零部件进行个性化制造调整。
模式结构
抽象工厂模式包含如下角色:
以本文实例代码为参考
- MotorcycleEngineNorms-摩托发动机通用制造方法
- MotorcycleScooterEngine-踏板摩托发动机制造方法
- MotorcycleStraddleEngine-跨骑摩托发动机制造方法
- MotorcycleBodyNorms-摩托车体通用制造方法
- MotorcycleScooterBody-踏板车体制造方法
- MotorcycleStraddleBody-跨骑摩托车体制造方法
- MotorcycleWhellNorms-摩托车轮通用制造方法
- MotorcycleScooterWhell-踏板摩托车轮制造方法
- MotorcycleStraddleWhell-跨骑摩托车轮制造方法
- MotorcycleFactory-摩托工厂标准
- MotorcycleScooterFactory-踏板摩托工厂
- MotorcycleStraddleFactory-跨骑摩托工厂
图例
以本文实例代码为参考
代码范例
<?php
/**
* 摩托发动机制造标准
*/
interface MotorcycleEngineNorms{
public function engine();
}
/**
* 踏板摩托发动机制造
*/
class MotorcycleScooterEngine implements MotorcycleEngineNorms{
public function engine(){
return "MotorcycleScooterEngine";
}
}
/**
* 跨骑摩托发动机制造
*/
class MotorcycleStraddleEngine implements MotorcycleEngineNorms{
public function engine(){
return "MotorcycleStraddleEngine";
}
}
/**
* 摩托车车体制造标准
*/
interface MotorcycleBodyNorms{
public function body();
}
/**
* 踏板摩托车车体制造
*/
class MotorcycleScooterBody implements MotorcycleBodyNorms{
public function body(){
return "MotorcycleScooterBody";
}
}
/**
* 跨骑摩托车车体制造
*/
class MotorcycleStraddleBody implements MotorcycleBodyNorms{
public function body(){
return "MotorcycleStraddleBody";
}
}
/**
* 摩托车车轮制造标准
*/
interface MotorcycleWhellNorms{
public function whell();
}
/**
* 踏板摩托车车轮制造
*/
class MotorcycleScooterWhell implements MotorcycleWhellNorms{
public function whell(){
return "MotorcycleScooterWhell";
}
}
/**
* 跨骑摩托车车轮制造
*/
class MotorcycleStraddleWhell implements MotorcycleWhellNorms{
public function whell(){
return "MotorcycleStraddleWhell";
}
}
/**
* 摩托工厂标准
*/
interface MotorcycleFactory{
public static function getInstance(string $type);
}
/**
* 踏板摩托工厂
*/
class MotorcycleScooterFactory implements MotorcycleFactory{
private static $instance;
public static function getInstance(string $type)
{
switch($type){
case "engine":
self::$instance = new MotorcycleScooterEngine();
break;
case "body":
self::$instance = new MotorcycleScooterBody();
break;
case "whell":
self::$instance = new MotorcycleScooterWhell();
break;
default:
throw new Exception("不能生产的摩托车零部件");
break;
}
return self::$instance;
}
}
/**
* 跨骑摩托工厂
*/
class MotorcycleStraddleFactory implements MotorcycleFactory{
private static $instance;
public static function getInstance(string $type)
{
switch($type){
case "engine":
self::$instance = new MotorcycleStraddleEngine();
break;
case "body":
self::$instance = new MotorcycleStraddleBody();
break;
case "whell":
self::$instance = new MotorcycleStraddleWhell();
break;
default:
throw new Exception("不能生产的摩托车零部件");
break;
}
return self::$instance;
}
}
//踏板车
$motoCycleScooter = array();
$motoCycleScooter["engine"] = MotorcycleScooterFactory::getInstance("engine")->engine();
$motoCycleScooter["body"] = MotorcycleScooterFactory::getInstance("body")->body();
$motoCycleScooter["whell"] = MotorcycleScooterFactory::getInstance("whell")->whell();
$motoCycleStraddle = array();
$motoCycleStraddle["engine"] = MotorcycleStraddleFactory::getInstance("engine")->engine();
$motoCycleStraddle["body"] = MotorcycleStraddleFactory::getInstance("body")->body();
$motoCycleStraddle["whell"] = MotorcycleStraddleFactory::getInstance("whell")->whell();
echo "踏板摩托车<br>";
var_dump($motoCycleScooter);
echo "<br>";
echo "跨骑摩托车<br>";
var_dump($motoCycleStraddle);
// return "fdafda";
模式分析
抽象工厂模式将工厂模式进行抽象,可以使得抽象出来的新结构更加的灵活。例如,生产摩托车身需要一个喷漆的动作,在工厂模式中,我们需要对整体结构进行更改,而抽象工厂中,只需要对生产车身进行更改。
模式分析
抽象工厂模式将工厂模式进行抽象,可以使得抽象出来的新结构更加的灵活。例如,生产摩托车身需要一个喷漆的动作,在工厂模式中,我们需要对整体结构进行更改,而抽象工厂中,只需要对生产车身进行更改。
优缺点
模式的优点
- 抽象工厂模式将工厂模式进行抽象,可以使得抽象出来的新结构更加灵活
- 抽象工厂模式同样具备工厂模式的优点-参考《php-工厂模式》
模式的缺点
- 使得整体结构的拓展或精简变得更加繁杂
- 抽象工厂模式同样具备工厂模式的缺点-参考《php-工厂模式》
适用环境
系统由多个产品系统中的一个来配置时
系统独立于产品的创建,组合和表示时
类库对外显示接口而不显示实现
关注微信公众号(yuantanphp) | |
---|---|
回复关键字 设计模式 可获取以下材料 《设计模式:可复用面向对象软件的基础》pdf版. php设计模式23种实例实现php源码 |