設計模式(二) 工廠模式(簡單工廠)

2021-10-09 21:10:58 字數 2592 閱讀 7092

我們在學習乙個東西之前,應該要先了解下他為什麼出現,他解決了什麼問題。這樣才可以帶著思考的高效學習。

以資料庫為例,我們知道常見的關係型資料庫有mysql、sqlserver、oracle等,每種資料庫連線例項的建立都是複雜且易錯麻煩的。如果將這些連線例項交給使用者來建立,是十分不合適的。我們就希望有乙個類幫我負責這些不同資料庫例項的建立。我們只需要告訴它我們需要哪個資料庫例項,以及一些引數(資料庫名稱,密碼等),它來建立好然後提供給我們。這樣不但可以減少**冗餘,也可以降低**的耦合度。

以剛剛資料庫為例子,我們嘗試寫乙個簡單的工廠類。那我們首先需要先提供下三種資料庫連線類(真正的連線是很複雜的,這裡簡單寫)。

第一步:先寫個資料庫連線的抽象類(水平有限,先這樣寫)。

假設有prepare()和finish()兩個方法,他們的作用就是完成複雜的物件建立工作,由工廠物件進行呼叫,所以將他們訪問級別設定為預設(我將工廠類和資料庫類放在了乙個包下)。

query()方法假設是資料庫可以進行的操作,工廠建立完例項後提供給使用者使用的,所以是public的。

getdatabasename()方法留給子類重寫。

package study.factory.******;

/** * @author 阿呆的小雞仔

*/public

abstract

class

database

/** * 設定資料庫名稱

* @return 資料庫的名稱

*/protected

abstract string getdatabasename()

;/**

* 建立資料庫連線例項需要的操作,每種資料庫應該都是不一樣的

*/void

prepare()

/** * 建立連線完成時的操作

*/void

finish()

/** * 假設這個是例項的功能,可以用來執行查詢語句

* @param query 查詢語句

*/public

abstract

void

query

(string query)

;}

第二步:寫一下mysql類和sqlserver類
package study.factory.******;

/** * @author 阿呆的小雞仔

*/public

class

mysql

extends

database

@override

public string getdatabasename()

@override

public

void

query

(string query)

}

這裡重寫下sqlserver的prepare(),區別下mysql與sqlserver的準備工作是不一樣。

package study.factory.******;

/** * @author 阿呆的小雞仔

*/public

class

sqlserver

extends

database

@override

public string getdatabasename()

@override

void

prepare()

@override

public

void

query

(string query)

}

第三步:寫我們的簡單工廠類
package study.factory.******;

/** * @author 阿呆的小雞仔

*/public

class

******factory

if(databasetype.sqlserver==type)

return database;

}public

enum databasetype

}

第四步:寫個測試類,試試使用我們的工廠類來建立物件。
/**

* @author 阿呆的小雞仔

*/public

class

main

}

執行結果:程式是正常執行的,不會有影響

之前我們把準備工作的prepare()和finish()方法設定為了包私密,所以這裡使用者是無法呼叫,避免了使用者自己建立資料庫類而做導致一系列不必要的錯誤。

優點:解耦

缺點:當我們需要新增乙個oracle資料庫類,我們就需要在工廠類上新增**,這樣就違反了開閉原則(開閉原則希望我們擴充套件專案時,只新增類,而不修改原有的類,修改原有的類可能會導致原有系統出錯,不方便維護)

設計模式 工廠模式(簡單工廠)

一 簡單工廠 定義 簡單工廠模式 factory pattern 屬於類的創新型模式,又叫靜態工廠方法模式 static factorymethod pattern 是通過專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。特點 工廠類直接實現,乙個產品介面,乙個工廠類可以產生多...

設計模式(簡單工廠模式 工廠模式 抽象工廠模式)

當邏輯較為簡單時,可以直接建立對應的類。如下 include using namespace std class class banana class pear intmain 通過此 可以發現,使用者直接與客戶接觸,違背了dip 依賴倒轉 原則,過於麻煩,所以引出簡單工廠模式。include us...

設計模式 工廠模式之簡單工廠模式

定義 由乙個工廠物件 工廠類 來指定建立某乙個產品類的例項。使用場景 客戶端只需傳入指定的引數即可,工廠類負責建立的物件較少 因為指定了傳入的引數 介面類 本想用iphone命名的,見諒 public inte ce phone實現介面類 public class huaweiphone imple...