學習gof23種設計模式,從學習簡單工廠開始是個不錯的選擇,簡單工廠雖不屬於gof設計模式中的一種,但它在開發中是非常常用的,也充分體現了物件導向開發的要點和好處,所以理解簡單工廠,對於後面學習其它的模式是非常有幫助的。
一、引出模式
我們時常聽說物件導向開發很厲害,所以在開發中我們會
時不時嘗試用物件導向的方法去開發程式,然後,就會遇到這種情況:面對物件開發,我們要有介面,我們要有實現介面的具體類,用的時候我們要遵循面向介面程式設計。於是乎就出現了這種情況:
ianimal animal = new哈哈,這不就是面向介面進行程式設計了嗎?當然,這可不是面向介面程式設計,雖然你使用了介面,但不代表就是面向介面程式設計。我們一起來圍觀下吧。這段**通常是寫在客戶端的,於是乎,客戶端既知道介面,又知道了具體的實現類。有何問題?我們還是先來回顧一下介面最主要的作用吧!沒錯,就是「封裝隔離」,具體的實現類被介面所封裝並使其與客戶端隔離,也就是說,客戶端不應該知道具體實現類的存在。如果不能像上面這樣做的話,客戶端現在只知道乙個介面,那我怎麼才能夠得到介面的物件呢?dog();
animal.call();
二、簡單工廠
1.我們先看看簡單工廠的定義吧!
定義:提供乙個建立物件例項的功能,而無需關心其具體的實現。
2.上述問題的解決方案:
既然我們在客戶端中無法直接得到實現類的物件,那我們可以新增乙個類,讓這個類來幫我們返回實現類的物件,這樣,客戶端只要和新增的類有關係就行了,就不需要知道具體的類了,這樣不就解除了它們之間的耦合了。
3.簡單工廠結構圖:
ianimal:定義客戶端所需要的功能介面。
dog:具體實現ianimal的實現類
pig:具體實現ianimal的實現類
factory:工廠,選擇何時的實現類來建立ianimal介面物件。
client:客戶端,通過factory來獲取ianimal介面物件。
4.簡單工廠示例**:
class三、理解簡單工廠program
}public
class
factory
else
if (name == "
dog"
)
else}}
public
inte***ce
ianimal
public
class
dog : ianimal
}public
class
pig : ianimal
}
1.靜態工廠
在客戶端中我們建立了工廠類的例項,使用該例項的create方法,來返回所需要的介面物件。我們其實可以將工廠類當作工具類進行使用,就是將create方法定義成靜態方法,直接通過factory.create()獲取物件例項,最好也將該類的建構函式設為私有,這樣外部就無法例項化該工廠類。靜態工廠就是這麼來的。
2.如何選擇合適的介面物件
工廠類是如何返回合適的介面物件的呢?一般常用的有兩種方式,第一種就是從客戶端獲取引數,通過對引數的判斷來選擇介面例項,上述的**示例就是採用此方法,第二種是通過獲取配置檔案中的值,來選擇介面例項。
3.工廠模式的優點
簡單工廠模式幫助我們實現了元件的封裝,可以讓外部實現面向介面程式設計。
簡單工廠模式實現了客戶端與具體實現類的解耦。客戶端只需知道工廠和介面就可以了。
4.工廠模式的缺點
增加的客戶端的複雜度,如果客戶端是通過引數獲取介面物件的,那麼客戶端就要理解引數所代表的具體功能。
系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯,有可能造成工廠邏輯過於複雜。
5.何時選用工廠模式
如果想要完全封裝隔離具體的實現,讓外部只能通過介面來操作封裝體,可以選用簡單工廠。
如果想要把對外建立物件的職責進行集中管理和控制,可以使用簡單工廠。
6.總結
簡單工廠的本質就是選擇實現,再重點就是「選擇」,一般在我們系統中介面和具體的實現類都是已經存在了的,我們要思考的就是「如何選擇」實現。
設計模式之 簡單工廠模式(二)
定義 簡單的工廠模式屬於建立型模式,又被稱為靜態工廠方法模式。抽象產品類 建立乙個計算機抽象產品類,如下 public abstract class computer具體產品類 具體的計算機產品分別是聯想,惠普和華碩計算機 public class hpcomputer extends comput...
設計模式二之 簡單工廠模式
簡單工廠模式 工廠類 業務類 具體實現類 自我理解 通過類的名字獲取工廠中的物件,主要是工廠幫助生成了所需的物件,工廠類 service requiredargsconstructor onconstructor autowired public class factory return null ...
設計模式(二) 工廠模式(簡單工廠)
我們在學習乙個東西之前,應該要先了解下他為什麼出現,他解決了什麼問題。這樣才可以帶著思考的高效學習。以資料庫為例,我們知道常見的關係型資料庫有mysql sqlserver oracle等,每種資料庫連線例項的建立都是複雜且易錯麻煩的。如果將這些連線例項交給使用者來建立,是十分不合適的。我們就希望有...