抽象工厂模式(Abstract Factory Pattern)
-
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
-
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
-
主要解决:主要解决接口选择的问题。
-
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
-
如何解决:在一个产品族里面,定义多个产品。
-
关键代码:在一个工厂里聚合多个同类产品。
-
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。 -
缺点:
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
示例代码:
abstract class Engine{}
class Engine_A extends Engine{
function __construct(){
echo 'Engine_A',PHP_EOL;
}
}
class Engine_B extends Engine{
function __construct(){
echo 'Engine_B',PHP_EOL;
}
}
abstract class Tyre{}
class Tyre_A extends Tyre{
function __construct(){
echo 'Tyre_A',PHP_EOL;
}
}
class Tyre_B extends Tyre{
function __construct(){
echo 'Tyre_B',PHP_EOL;
}
}
abstract class AbstractFactory{
abstract function getEngine();
abstract function getTyre();
}
class BMW320Factory extends AbstractFactory{
function __construct(){
echo 'BMW 320i:',PHP_EOL;
}
function getEngine(){
return new Engine_B;
}
function getTyre(){
return new Tyre_A;
}
}
class BMW325Factory extends AbstractFactory{
function __construct(){
echo 'BMW 325i:',PHP_EOL;
}
function getEngine(){
return new Engine_A;
}
function getTyre(){
return new Tyre_A;
}
}
class BenzSFactory extends AbstractFactory{
function __construct(){
echo 'Benz S:',PHP_EOL;
}
function getEngine(){
return new Engine_B;
}
function getTyre(){
return new Tyre_B;
}
}
/*
演示:
*/
$bmw=new BMW320Factory;
$bmw->getEngine();
$bmw->getTyre();
echo '',PHP_EOL;
$benz=new BenzSFactory;
$benz->getEngine();
$benz->getTyre();
运行结果:
BMW 320i:
Engine_B
Tyre_A
Benz S:
Engine_B
Tyre_B