设计模式之工厂模式之抽象工厂(php实现)

抽象工厂模式:

先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。
图中的BmwCar和BenzCar就是两个产品树(产品等级结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。
可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
而且使用抽象工厂模式还要满足一下条件:
1.系统中有多个产品族,而系统一次只可能消费其中一族产品
2.同属于同一个产品族的产品以其使用。
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。由具体的类来实现。

(1)Driver.class.php(抽象父类,用于规范子类实现)

<?php

namespace Factory\AbstractFactory;

abstract class Driver
{
    public abstract function driverBenzCar();
    public abstract function driverBwmCar();
}

(2)BenzCar.class.php(抽象父类,用于规范子类实现)

<?php

namespace Factory\AbstractFactory;

abstract class BenzCar
{
    public abstract function drive();
}

(3)BenzSportCar.class.php(具体实现类)

<?php
namespace Factory\AbstractFactory;

class BenzSportCar extends BenzCar
{
    public function drive()
    {
        return '开奔驰跑车';
    }
}

(4)BenzBusinessCar(具体实现类)

<?php
namespace Factory\AbstractFactory;

class BenzBusinessCar extends BenzCar
{
    public function drive()
    {
        return '开奔驰商务车';
    }
}

(5)BwmCar.class.php(抽象父类,用于规范子类实现)

<?php

namespace Factory\AbstractFactory;

abstract class BwmCar
{
    public abstract function drive();
}

(6)BwmSport.class.php(具体实现类)

<?php
namespace Factory\AbstractFactory;

class BwmSportCar extends BenzCar
{
    public function drive()
    {
        return '开宝马跑车';
    }
}

(7)BwmBusiness.class.php

<?php
namespace Factory\AbstractFactory;

class BwmBusinessCar extends BenzCar
{
    public function drive()
    {
        return '开宝马商务车';
    }
}

(8)BusinessDriver.class.php(具体产品族实现类)

<?php

namespace Factory\AbstractFactory;

class BusinessDriver extends Driver
{
    public function driverBenzCar()
    {
        return new BenzBusinessCar();
    }
    
    public function driverBwmCar()
    {
        return new BwmBusinessCar();
    }
}

(9)SportDriver.class.php(具体产品族实现类)

<?php

namespace Factory\AbstractFactory;

class SportDriver extends Driver
{
    public function driverBenzCar()
    {
        return new BenzSportCar();
    }
    
    public function driverBwmCar()
    {
        return new BwmSportCar();
    }
}
(10)客户端类
<?php

spl_autoload_register(function ($className){
    $className = str_replace('\\','/',$className);
    include $className.".class.php";
});

use Factory\AbstractFactory\SportDriver;

$type = new SportDriver();
$car = $type->driverBwmCar();
$string = $car->drive();
echo $string;
发布了47 篇原创文章 · 获赞 7 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/bujidexinq/article/details/105017895