一提到工廠,大家可能腦海裏就是機器轟鳴轟鳴的聲音,然後一件件的產品就生產出來了。那麼軟件設計中的工廠模式又是什麼?跟現實中一樣,只是工廠方法用來生成的對象,而不是產品。
爲什麼會出現工廠模式呢,在面向對象的設計中強調“抽象高於實現”,也就是說我們要儘量的一般化而不是特殊化,工廠方法模式解決了當代碼關注於抽象類型時如何創建對象的實例問題。
假設某一製衣廠商能夠生產一批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();