php-抽象工厂模式实现

php-抽象工厂模式实现

概述

抽象工厂模式(Abstract Factory):抽象工厂模式是对工厂模式的抽象,通俗来说,就是把工厂模式的结构分离出来成为能独立运行的个体。工厂模式请参考文章 《php-工厂模式实现》

还是拿工厂模式现实中中的例子:

现在有一个摩托车制造厂,它生产踏板摩托和跨骑摩托车,踏板车和跨骑车都是由发动机、车身和轮子组成的。

在工厂模式中,我们把踏板摩托车和跨骑摩托车作为摩托族群中的两个类别,生产引擎、车身和轮子为生产摩托车的固定结构,

在抽象工厂模式中,我们把摩托车生产所需引擎,车身,和轮子按踏板和跨骑摩托车独立分开制造,以便增加对摩托车所需零部件进行个性化制造调整。

模式结构

抽象工厂模式包含如下角色:

以本文实例代码为参考

  1. MotorcycleEngineNorms-摩托发动机通用制造方法
  2. MotorcycleScooterEngine-踏板摩托发动机制造方法
  3. MotorcycleStraddleEngine-跨骑摩托发动机制造方法
  4. MotorcycleBodyNorms-摩托车体通用制造方法
  5. MotorcycleScooterBody-踏板车体制造方法
  6. MotorcycleStraddleBody-跨骑摩托车体制造方法
  7. MotorcycleWhellNorms-摩托车轮通用制造方法
  8. MotorcycleScooterWhell-踏板摩托车轮制造方法
  9. MotorcycleStraddleWhell-跨骑摩托车轮制造方法
  10. MotorcycleFactory-摩托工厂标准
  11. MotorcycleScooterFactory-踏板摩托工厂
  12. 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";

模式分析

抽象工厂模式将工厂模式进行抽象,可以使得抽象出来的新结构更加的灵活。例如,生产摩托车身需要一个喷漆的动作,在工厂模式中,我们需要对整体结构进行更改,而抽象工厂中,只需要对生产车身进行更改。

模式分析

抽象工厂模式将工厂模式进行抽象,可以使得抽象出来的新结构更加的灵活。例如,生产摩托车身需要一个喷漆的动作,在工厂模式中,我们需要对整体结构进行更改,而抽象工厂中,只需要对生产车身进行更改。

优缺点

模式的优点

  1. 抽象工厂模式将工厂模式进行抽象,可以使得抽象出来的新结构更加灵活
  2. 抽象工厂模式同样具备工厂模式的优点-参考《php-工厂模式》

模式的缺点

  1. 使得整体结构的拓展或精简变得更加繁杂
  2. 抽象工厂模式同样具备工厂模式的缺点-参考《php-工厂模式》

适用环境

系统由多个产品系统中的一个来配置时

系统独立于产品的创建,组合和表示时

类库对外显示接口而不显示实现

关注微信公众号(yuantanphp)
回复关键字 设计模式 可获取以下材料
《设计模式:可复用面向对象软件的基础》pdf版.
php设计模式23种实例实现php源码
在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯伪猿

觉得文章不错?打赏支持一下吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值