github地址:
git@github.com:ZQCard/design_pattern.git
抽象工厂模式:
先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。
图中的BmwCar和BenzCar就是两个产品树(产品等级结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。
可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
而且使用抽象工厂模式还要满足一下条件:
1.系统中有多个产品族,而系统一次只可能消费其中一族产品
2.同属于同一个产品族的产品以其使用。
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。由具体的类来实现。
(1)Driver.class.php(抽象父类,用于规范子类实现)
<?php namespace FactoryAbstractFactory; abstract class Driver { public abstract function driverBenzCar(); public abstract function driverBwmCar(); }
(2)BenzCar.class.php(抽象父类,用于规范子类实现)
<?php namespace FactoryAbstractFactory; abstract class BenzCar { public abstract function drive(); }
(3)BenzSportCar.class.php(具体实现类)
<?php namespace FactoryAbstractFactory; class BenzSportCar extends BenzCar { public function drive() { return '开奔驰跑车'; } }
(4)BenzBusinessCar(具体实现类)
<?php namespace FactoryAbstractFactory; class BenzBusinessCar extends BenzCar { public function drive() { return '开奔驰商务车'; } }
(5)BwmCar.class.php(抽象父类,用于规范子类实现)
<?php namespace FactoryAbstractFactory; abstract class BwmCar { public abstract function drive(); }
(6)BwmSport.class.php(具体实现类)
<?php namespace FactoryAbstractFactory; class BwmSportCar extends BenzCar { public function drive() { return '开宝马跑车'; } }
(7)BwmBusiness.class.php
<?php namespace FactoryAbstractFactory; class BwmBusinessCar extends BenzCar { public function drive() { return '开宝马商务车'; } }
(8)BusinessDriver.class.php(具体产品族实现类)
<?php namespace FactoryAbstractFactory; class BusinessDriver extends Driver { public function driverBenzCar() { return new BenzBusinessCar(); } public function driverBwmCar() { return new BwmBusinessCar(); } }
(9)SportDriver.class.php(具体产品族实现类)
<?php namespace FactoryAbstractFactory; 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 FactoryAbstractFactorySportDriver; $type = new SportDriver(); $car = $type->driverBwmCar(); $string = $car->drive(); echo $string;