平面继承层次的出现是工厂方法模式带来的一个问题。每次添加产品家族时,你就被迫去创建一个相关的具体创造者。一个快速增长的系统会包含原来越多的产品,这样维护起来就会非常的恶心。
一个避免这种依赖的办法就是使用clone复制已存在的具体产品,具体产品本身便成了它们自己生成的基础。
<?php
/**
* 这是一片海
*/
class Sea{}
class EarthSea extends Sea{}
class MarsSea extends Sea{}
/**
* 这是一片平原
*/
class Plains{}
class EarthPlains extends Plains{}
class MarsPlains extends Plains{}
/**
* 这是一片深林
*/
class Forest{}
class EarthForest extends Forest{}
class MarsForest extends Forest{}
/**
* 造地工厂
*/
class TerrainFactory {
private $sea;
private $plains;
private $forest;
function __construct(Sea $sea, Plains $plains, Forest $forest){
$this->sea = $sea;
$this->plains = $plains;
$this->forest = $forest;
}
function getSea(){
return clone $this->sea;
}
function getPlains(){
return clone $this->plains;
}
function getForest(){
return clone $this->forest;
}
}
$factory = new TerrainFactory(new EarthSea(),new EarthPlains(),new MarsForest());
print_r($factory->getSea());
print_r($factory->getPlains());
print_r($factory->getForest());
使用该模式我们可以用组合代替继承,这样的转变则促进了代码运行时的灵活性,并减少了必须创建的类。