工廠類別就是一個專門用來創建其它物件的類別,工廠類別在多態性程式設計實踐中是非常重要的。它允許動態替換類,修改配置,會使應用程式更加靈活。掌握工廠模式對Web開發是不可或缺的。
工廠模式通常用來傳回類似介面的不同的類,工廠的常見用法就是創建多態的提供者。
通常工廠模式有一個關鍵的構造,即一般被命名為factory的靜態方法。這個靜態方法可以接受任意數量的參數,並且必須傳回一個物件。
Program List:基本的工廠類別
class Fruit {
// 物件從工廠類別回傳
}
Class FruitFactory {
}
Class FruitFactory {
}
Class FruitFactory {actory 的一個新物件
// function實例
return new Fruit();
}
// 呼叫工廠
$instance = FruitFactory::factory();
?>
Program List:利用工廠類別生產物件類型生產物件{
// The parameterized factory method
public static function factory($type)
{
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw newception('Driver not found
}
// Load a MySQL Driver
$mysql = Example::factory('MySQL');
// Load an SQLite Driver
$sqlite = Example::factory('SQLite');
?>
Program List:一個完整的工廠類
下面的程序定義了一個通用的工廠類,它生產能夠保存你所有操作的空對象,你可以得到一個實例,這些操作都在那個實例中了。
/**
* 一般工廠類別
*
* 這個魔法工廠會記住你所有所執行的操作,
* 並將它們應用到它實例化的物件上。
*
*/
class FruitFactory {
private $his */
function __construct ( $類 ) {
$ args = func_get_args();
$this->class = $class;
$this->constructor_args = array_slice( $args, 1 );
函數__call( $method, $args ) {
$this -> History[] = array(
'action' => '呼叫',
'工作' meth arg
);
}
函數__set( $屬性, $value ) {
$this->history[] = array(
'action'
值'' => $值
) ;
# &*/
function instance() {
# 使用 Reflection 建立新實例,使用 $args
$object = $reflection_object->newInstanceArgs( $this->constructor_args );
# 不使用ReflectionClass,但不支援變數的替代方法
# 建構函數參數的數量。 class();
# 重複所有記住的操作,而應用到新對象。 call_user_func_array( array( $object, $item['method' ] ),$ item ['args']);
}
if($ item ['action'] =='set'){
$ object-> {$ item ['property']} = $ item ['' value' ];
}
}
return $object;
}
}
class Fruit {
private $name, $color; {
private $name, $color; function __construct( $name , $color ) {
$this->name = $name;
$this->color = $color;
}
$this->name = $name;
}
function introduce() {
this function introduce() {
this this function printuce() {) is {$this->price } RMB.";
}
}
# Setup aFactor factory
$fruit_factory = new Setup aFactor factory == Name('Apple');
$fruit_factory ->price = 2;
# Get an instance
$apple = $fruit_factory->instance();
$apple->introduce();
?>
程序運行結果:
Hello, this is an Apple , its price is 2 RMB.
工廠模式主要是為創建對象提供過渡接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。
工廠模式可分為三類:
簡單工廠模式(Simple Factory)
工廠方法模式(Factory Method)
抽象工廠模式(Abstract Factory)
這三種模式從上到下抽象並且更具一般性。
簡單工廠模式又稱靜態工廠方法模式。重命名上就可以看出這個模式一定很簡單。它存在的目的很簡單:定義一個用於建立物件的介面。工廠方法模式去除了簡單工廠模式中工廠方法的靜態屬性,使得它可以被子類別繼承。這樣在簡單工廠模式裡集中在工廠方法上的壓力可以由工廠方法模式裡不同的工廠子類來分擔。
工廠方法模式彷彿已經很完美的對物件的創建進行了包裝,使得客戶程式中僅僅處理抽象產品角色提供的介面。那我們是否一定要在程式碼中遍布工廠呢?大可不必。也許在下面情況下你可以考慮使用工廠方法模式:
當客戶程式不需要知道要使用物件的創建過程。
客戶程式所使用的物件有變動的可能,或是根本就不知道使用哪一個具體的物件。
更多理解PHP的工廠模式Factory Pattern相關文章請關注PHP中文網!