引入: 在我們的思維中,會有一種習慣,當遇到某種問題時,會直接考慮用最直接的語言去去實作它,而往往忽略了整個程式的可維護性、可擴充性。 比如,我們寫一個基本的電腦功能,要求能計算四則運算,大家或許會直接寫:
如此代碼,确實能夠完成簡單的四則運算,但是,我們可以發現,在main方法裡,我們不僅要擷取使用者輸入,還要執行運算,也就是說,該段代碼既有了界面程式設計、又有了邏輯實作,可以想像,這個代碼多麼的繁雜,根本不利于以後的維護。
那當然了,我們可以用面向對象的思想,将界面邏輯和運算邏輯分開,把運算單獨的封裝起來,可以實作重複利用:
運算邏輯實作類operation.java:
用戶端可以直接調用運算邏輯:
寫到這裡,或許大家認為,已經很好了,代碼基本具有了可維護性及可擴充性,比如我增加一個求餘數操作,隻需要再operation的switch分支中添加一個求餘的判斷即可。 但是,這真的夠了麼?
當然不夠了,你要想想,這個地方,我們要加一個求餘數操作,但是我們需要其餘的加減乘除的運算都參與編譯,顯然這是不合适的,會降低程式的運作效率。
顯然,為了降低程式的耦合度,我們需要将加減乘除等各種運算分離開,利用繼承和多态的思想,完成運算操作:
以上,我們定義了一個抽象類operation,該類裡有一個抽象方法getresult(),專門使用者擷取運算結果,所有的operation的子類都必須重寫該方法。
看,我們已經成功的分離了各種運算方法,使得程式具有更好的擴充性: 如果想增加一個别的運算方法,可以直接繼承operation,
實作自己的運算法則即可。那接下來,如何讓我們的計算機知道你希望用哪一個算法呢?這裡就要引出了簡單工廠模式。
什麼是簡單工廠模式:
簡單工廠模式(simple factory pattern)屬于類的創新型模式,又叫靜态工廠方法模式(static factorymethod pattern),是通過專門定義一個類來負責建立其他類的執行個體,被建立的執行個體通常都具有共同的父類。
簡單工廠模式的uml圖:
簡單工廠模式中包含的角色及其相應的職責如下:
工廠角色(creator):這是簡單工廠模式的核心,由它負責建立所有的類的内部邏輯。當然工廠類必須能夠被外界調用,建立所需要的産品對象。
抽象(product)産品角色:簡單工廠模式所建立的所有對象的父類,注意,這裡的父類可以是接口也可以是抽象類,它負責描述所有執行個體所共有的公共接口。
具體産品(concrete product)角色:簡單工廠所建立的具體執行個體對象,這些具體的産品往往都擁有共同的父類。

了解簡單工廠模式後,我們用簡單工廠模式,來“生産”運算類:
可見,我們利用繼承及多态,實作工廠,可以實作對“運算類”的“生産”操作,以後再添加别的運算,可以直接使用工廠類去添加運算操作類。
簡單工廠模式的優缺點分析:
優點:工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的對象。使用者在使用時可以直接根據工廠類去建立所需的執行個體,而無需了解這些對象是如何建立以及如何組織的。有利于整個軟體體系結構的優化。
缺點:由于工廠類集中了所有執行個體的建立邏輯,這就直接導緻一旦這個工廠出了問題,所有的用戶端都會受到牽連;而且由于簡單工廠模式的産品室基于一個共同的抽象類或者接口,這樣一來,但産品的種類增加的時候,即有不同的産品接口或者抽象類的時候,工廠類就需要判斷何時建立何種種類的産品,這就和建立何種種類産品的産品互相混淆在了一起,違背了單一職責,導緻系統喪失靈活性和可維護性。而且更重要的是,簡單工廠模式違背了“開放封閉原則”,就是違背了“系統對擴充開放,對修改關閉”的原則,因為當我新增加一個産品的時候必須修改工廠類,相應的工廠類就需要重新編譯一遍。
總結一下:簡單工廠模式分離産品的建立者和消費者,有利于軟體系統結構的優化;但是由于一切邏輯都集中在一個工廠類中,導緻了沒有很高的内聚性,同時也違背了“開放封閉原則”。另外,簡單工廠模式的方法一般都是靜态的,而靜态工廠方法是無法讓子類繼承的,是以,簡單工廠模式無法形成基于基類的繼承樹結構。
簡單工廠模式的實際應用簡介:
作為一個最基本和最簡單的設計模式,簡單工廠模式卻有很非常廣泛的應用,我們這裡以java中的jdbc操作資料庫為例來說明。
jdbc是sun公司提供的一套資料庫程式設計接口api,它利用java語言提供簡單、一緻的方式來通路各種關系型資料庫。java程式通過jdbc可以執行sql語句,對擷取的資料進行處理,并将變化了的資料存回資料庫,是以,jdbc是java應用程式與各種關系資料進行對話的一種機制。用jdbc進行資料庫通路時,要使用資料庫廠商提供的驅動程式接口與資料庫管理系統進行資料互動。
用戶端要使用使用資料時,隻需要和工廠進行互動即可,這就導緻操作步驟得到極大的簡化,操作步驟按照順序依次為:注冊并加載資料庫驅動,一般使用class.forname();建立與資料庫的連結connection對象;建立sql語句對象preparedstatement(sql);送出sql語句,根據實際情況使用executequery()或者executeupdate();顯示相應的結果;關閉資料庫。