点击上方“Lemon黄”关注我哦,不定期原创文,定期好技术文推广分享
提供一个用于创建相关或依赖对象的接口,而无需指定其具体类。
Dragon公司的业务受到轰炸,而CEO希望特许所有海外分支机构的专营权。他首先要注意的问题是如何确保产品质量。他们不希望特许经营者削减成本和使用低质量的组件。低质量的玩具肯定会破坏Dragon品牌的声誉。因此,CEO希望将业务特许经营,但他们仍然希望每个地方都有工厂来提供组件。开发人员聚集起来,开始集思广益。玩具使用三种类型的组件。发动机,车轮和动叶片。例如,一辆玩具车需要一个发动机和四个轮,而玩具直升机则需要一个动叶片和一个发动机。
让我们首先创建一个抽象工厂类,它是所有具体工厂的基础。请注意,抽象工厂实质上由一组工厂方法组成:
//抽象工厂类
abstract class ComponentsFactory
{
abstract function createEngine() ;//创建发动机
abstract function createWheel() ;//创建车轮
abstract function createRotorBlade() ;//创建动叶片
}
然后创建一个特定于地方的工厂(用于创建混凝土组件的混凝土工厂)。让我们为纽约创建一个:
class NyComponentsFactory extends ComponentsFactory
{
public function createEngine()
{
return new NyEngine();
}
public function createWheel()
{
return new NyWheel();
}
public function createRotorBlade()
{
return new NyRotorBlade();
}
}
玩具类(Toy
)也需要修改。需要阐明发动机,车轮和转子叶片,并且prepare()
函数需要抽象出来(此方法将由具体类来实现。在实现中,子类使用其特定于地方的c抽象工厂类(ComponentsFactory
)来创建具体组件)。修改玩具类(Toy
)如下:
abstract class Toy {
public $name = '';
public $price = 0;
public $engine = null;
public $wheels = array();
public $rotorBlade = null;
abstract function prepare() ;
public function package()
{
echo $this->name. ' is packaged';
}
public function label()
{
echo $this->name . ' is priced at '.$this->price;
}
}
接下来,让我们修改NyCar
类和NyHelicopter
类来实现prepare()
方法:
class NyCar extends Toy
{
public $name = 'NyCar';
public $price = 30;
public $componentsFactory = null;
public function __construct(ComponentsFactory $componentsFactory)
{
$this->componentsFactory = componentsFactory;
}
public function prepare()
{
$this->engine = $this->componentsFactory->createEngine();
$this->wheels[] = $this->componentsFactory->createWheel();
$this->wheels[] = $this->componentsFactory->createWheel();
$this->wheels[] = $this->componentsFactory->createWheel();
$this->wheels[] = $this->componentsFactory->createWheel();
}
}
class NyHelicopter extends Toy
{
public $name = 'NyCar';
public $price = 30;
public $componentsFactory = null;
public function __construct(ComponentsFactory $componentsFactory)
{
$this->componentsFactory = componentsFactory;
}
public function prepare()
{
$this->engine = $this->componentsFactory->createEngine();
$this->rotorBlade = $this->componentsFactory->createRotorBlade();
}
}
最后,需要修改具体的ToysFactory
的工厂方法。在此处添加特定于地方的ComponensFactory。让我们完成NyToysFactory
的代码:
class NyToysFactory extends ToysFactory
{
public function createToy($toyName)
{
$toy = null;
$nyComponentsFactory = new NyComponentsFactory();
if ('car'==$toyName) {
$toy = new NyCar($nyComponentsFactory);
} else if ('helicopter'==$toyName) {
$toy = new NyHelicopter($nyComponentsFactory);
}
return $toy;
}
}
现在,每个特许经营的专营权,都由Dragon公司总部控制的部件工厂来提供部件。
在这节中,我们建立以一个特许经营的框架,使Dragon公司拥有控制权,并未每个特许经营者提供足够的自由来做他们擅长的事情。