一、什麼是簡單工廠模式
簡單工廠 (Simple Factory)又稱靜態工廠方法模式(Static Factory Method Pattern)
使用的頻率可以說是非常之高,它的官方解釋為:定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠模式使一個類的例項化延遲到其子類。
這個模式本身很簡單而且使用在業務較簡單的情況下。一般用於小專案或者具體產品擴充套件教師較少的情況(這樣工廠類才不用經常更改)。
PS:不修改程式碼的話,是無法擴充套件的。
二、簡單工廠模式的作用
簡單工廠的作用是例項化物件,而不需要客戶瞭解這個物件屬於哪個具體的子類。簡單工廠例項化的類具有相同的介面或者基類,在子類比較固定並不需要擴充套件時,可以使用簡單工廠,一定程度上可以很好的降低耦合度。
三、案例
- 支付寶、微信、銀聯的連線方式(connectMode),支付方式(payMode)。使用工廠模式,“客戶”就不需要不要知道具體的連線方式和支付方式了,只需要呼叫connectMode 和payMode即可。
- MySQL、SQL Server、Oracle等資料庫的連線方式(connectMode)、查詢方式(selectMode)等操作可以使用工廠模式進行封裝。下面的例子會講到。
我們以資料庫類建立的案例來說:
產品類
/**
* 資料庫系列
*
*/
abstract Class DataBase
{
abstract function getOne($sql); //獲取一條資料的方法
}
Class SqlServer extends DataBase
{
function __construct() {
$connect = "SqlServer 連線方法操作 (騰訊雲伺服器)";
return $connect
}
function getOne($sql){
return "查詢後返回資料結果";
}
}
Class MySql extends DataBase
{
function __construct(){
$connect = "MySql 連線方法操作 (阿里雲伺服器)";
return $connect
}
function getOne($sql){
return "查詢後返回資料結果";
}
}
工廠類
/**
*
* 建立資料庫的工廠類
*/
class Factory {
static function createDataBase($type) {
switch ($type) {
case SqlServer:
return new SqlServer();
case MySql:
return new MySql();
//....
}
}
客戶類
/**
*
* 客戶通過工廠獲取資料
*/
class Customer {
private $database;
function getDataBase($type) {
return $this->database = Factory::createDataBase($type);
}
}
$custome = new Customer;
$db = $custome->getDataBase("SqlServer"); // 我要獲取阿里雲的SQL Server資料庫的資料。
$data = $db->getOne($sql);
四、組成部分
通過以上案例可以得知一般情況下工廠模式由以下幾個部分組成:
- 工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯,根據邏輯不同,產生具體的工廠產品。如例子中的Factory類。
- 抽象產品角色:它一般是具體產品繼承的父類或者實現的介面。由介面或者抽象類來實現。如例中的DataBase介面。
- 具體產品角色:工廠類所建立的物件就是此角色的例項。在JAVA中由一個具體類實現,如例子中的MySql和SqlServer類。
使用工廠設計模式時必須先歸類你的產品(需求)找到共同點和特徵,然後根據共同的地方建立各自的產品類,這時候如果沒有無法通過客戶類去呼叫每一個產品類,那麼耦合度會大大增高(在需求變動的時候), 這時候建立一個工廠類統一管理產品類,再通過客戶類呼叫。 那麼可以很好的管理程式碼並一定程度上的解耦。