一提到工厂,大家可能脑海里就是机器轰鸣轰鸣的声音,然后一件件的产品就生产出来了。那么软件设计中的工厂模式又是什么?跟现实中一样,只是工厂方法用来生成的对象,而不是产品。
为什么会出现工厂模式呢,在面向对象的设计中强调“抽象高于实现”,也就是说我们要尽量的一般化而不是特殊化,工厂方法模式解决了当代码关注于抽象类型时如何创建对象的实例问题。
假设某一制衣厂商能够生产一批T恤(T-shirt),我们可以定义如下代码:
<?php
abstract class Clothes{
//颜色
private $color;
public function getColor(){
return $this->color;
}
public function setColor($color){
$this->color = $color;
}
}
//T恤类
class Tshirt extends Clothes{
public function __construct($color){
$this->setColor($color);
}
}
那么如果我们需要得到T恤对象的话
//生产了一件白色的T恤
$tshirt = new Tshirt("white");
Ok,上面的代码为我们创建出了一件T恤,挺简单的是吧。但是,这时候主任说,我们不要生成白色的了,现在需要生产一批黄色的衬衫。那糟糕了,我们得改程序里面所有有关new Tshirt("white")的代码。怎么解决这样的问题呢,所有工厂方法产生了工厂类如下:
class Factory{
//这里可以通过配置文件得到,为了简单,当作工厂方法的一个属性
public $color = "yellow";
//根据传递进来不同的参数决定实例化什么样的对象
public function produceClothes(){
return new Tshirt($this->color);
}
}
现在我们不管生成什么颜色的T恤只需要如下的代码调用, 生成什么颜色的T恤就与客户端隔离开来, 他只要调用工厂方法来生产就行。而工厂方法则去决定生产什么样的颜色。
$factory = new Factory();
$tshirt = $factory->produceClothes();