spring中常見的設計模式之工廠模式

2021-10-08 05:59:05 字數 3330 閱讀 7094

設計模式是為解決生活中的問題而誕生的,也就是說我們可以通過生活中的問題來解釋各種各樣的模式,也是前人對**開發經驗的總結。

工廠模式分為簡單工廠、工廠方法、抽象工廠。我們可以通過使用生活的例子來解釋它們的作用

1、簡單工廠可以看做一些小作坊模式,生產的產品由客戶選擇(簡單工廠if、else或者case語句較多)

具體結構有:

工廠:實現產品的內部邏輯,由外界呼叫。

抽象產品:所有產品的共有方法,由產品實現。

產品:簡單工廠模式的建立目標,所有被建立的物件都是某個具體類的例項。

工廠的產品

package des.factory;

public inte***ce milk

抽象產品

package des.factory;

public class yili implements milk

}

工廠

package des.factory.******;

import des.factory.milk;

import des.factory.yili;

public class ******factory

return null;

}}

簡單工廠模式的優缺點及其適用環境

優點:(1)工廠類中已經包含必要的邏輯判斷,客戶無需要建立產品類

(2)客戶不需要知道具體的產品類,只需要知道具體的幾個引數即可

(3)可以通過引入xml方式來產生和建立產品

缺點:(1)工廠類中集齊了所有的邏輯判斷職責過重,一旦出現異常,則會崩潰

(2)使用簡單工廠模式會增加系統中類的個數(引入新的工廠類),增加系統的複雜度和理解難度

(3)系統擴充套件困難,一旦增加新產品不得不修改工廠邏輯,在產品型別較多時,可能造成邏輯過於複雜

適用環境:

(1)工廠類負責建立對的物件比較少,因為不會造成工廠方法中的業務邏輯過於複雜

(2)客戶端只知道傳入工廠類的引數,對如何建立物件不關心

2、工廠方法可以看做一條流水線進行生產,只能生產乙個產品

具體的結構:

抽象工廠:宣告抽象工廠的方法,用於生產一件產品。

具體工廠:實現產品的內部邏輯,由外界呼叫。

抽象產品:所有產品的共有方法,由產品實現。

產品:簡單工廠模式的建立目標,所有被建立的物件都是某個具體類的例項。

**在簡單工廠的抽象產品,具體產品類的基礎上新增抽象工廠、具體工廠

抽象工廠

package des.factory.func;

import des.factory.milk;

public inte***ce factory

具體工廠

package des.factory.func;

import des.factory.milk;

import des.factory.yili;

public class yilifactory implements factory

}

工廠方法模式的優缺點及其適用環境

優點:(1)更符合開-閉原則 

新增一種產品時,只需要增加相應的具體產品類和相應的工廠子類即可

(2)符合單一職責原則 

每個具體工廠類只負責建立對應的產品

(3)不使用靜態工廠方法,可以形成基於繼承的等級結構。

缺點:(1)新增新產品時,除了增加新產品類外,還要提供與之對應的具體工廠類,系統類的個數將成對增加,在一定程度上增加了系統的複雜度;同時,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷;

(2)由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端**中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到dom、反射等技術,增加了系統的實現難度。

(3)雖然保證了工廠方法內的對修改關閉,但對於使用工廠方法的類,如果要更換另外一種產品,仍然需要修改例項化的具體工廠類;

(4)乙個具體工廠只能建立一種具體產品

適用環境:

(1)當乙個類不知道它所需要的物件的類時 

在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可;

(2)當乙個類希望通過其子類來指定建立物件時 

在工廠方法模式中,對於抽象工廠類只需要提供乙個建立產品的介面,而由其子類來確定具體要建立的物件,利用物件導向的多型性和黎克特制代換原則,在程式執行時,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。

(3)將建立物件的任務委託給多個工廠子類中的某乙個,客戶端在使用時可以無須關心是哪乙個工廠子類建立產品子類,需要時再動態指定,可將具體工廠類的類名儲存在配置檔案或資料庫中。

3抽象工廠可以看做乙個大規模的工廠,標準化批量的生產多種商品

抽象工廠:宣告抽象工廠的方法,用於生產多件產品。

具體工廠:實現產品的內部邏輯,由外界呼叫。

抽象產品:所有產品的共有方法,由產品實現。

產品:簡單工廠模式的建立目標,所有被建立的物件都是某個具體類的例項。

在工廠方法的抽象產品,具體產品的基礎上,增加抽象工廠,具體工廠

抽象工廠

package des.factory.abstrac;

import des.factory.milk;

public abstract class abstractfactory

具體工廠

package des.factory.abstrac;

import des.factory.milk;

import des.factory.yili;

public class milkfactory extends abstractfactory

}

抽象工廠模式的優缺點及其適用環境

(1)具體產品在應用層**隔離,無須關心建立細節

(2)將一系列的產品族統一到一起建立

(1)規定了所有可能被建立的產品集合,產品族中擴充套件新的產品困難,需要修改抽象工廠的介面

(2)增加了系統的抽象性和理解難度

適用環境

1、客戶端(應用層)不依賴於產品類例項如何被建立、實現等細節

2、強調一系列相關的產品物件(屬於同一產品族)一起使用建立物件需要大量重複的**

3、提供乙個產品類的庫,所有的產品以同樣的介面出現,從而使客戶端不依賴於具體實現

Spring中常見的設計模式 裝飾者模式

裝飾者模式 decorator pattern 是指在不改變原有物件的基礎上,將功能附加到物件上,提供了比繼承更有彈性的方案 擴充套件原有物件的功能 屬於結構型模式。裝飾者模式適用於以下場景 以做煎餅果子為例演示裝飾者模式是怎麼裝的 首先做乙個煎餅果子抽象 public abstract class...

Spring 中常用的設計模式對比

各設計模式對比及程式設計思想總結 設計模式 一句話歸納 舉例工廠模式 factory 只對結果負責,封裝建立過程。beanfactory calender 單例模式 singleton 保證獨一無二。原型模式 prototype 拔一根猴毛,吹出千萬個。arraylist prototypebean...

js中常見設計模式總結

1.只有乙個例項。2.可以全域性訪問。3.節省記憶體開銷 function single name single.prototype.getname function single.prototype.createobj function name return this obj let a sin...