簡單工廠和工廠方法模式

2021-09-27 11:38:50 字數 3428 閱讀 2268

總原則:開閉原則(open close principle)

開閉原則就是說對擴充套件開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的**,而是要擴充套件原有**,實現乙個熱插拔的效果。所以一句話概括就是:為了使程式的擴充套件性好,易於維護和公升級。想要達到這樣的效果,我們需要使用介面和抽象類等,後面的具體設計中我們會提到這點。

首先,簡單工廠模式不屬於23中涉及模式簡單工廠模式模式分為三種:普通簡單工廠、多方法簡單工廠、靜態方法簡單工廠。

普通簡單工廠

就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。首先看下關係圖:

舉例如下:(我們舉乙個傳送郵件和簡訊的例子)

首先,建立二者的共同介面:

public

inte***ce

sender

其次,建立實現類

mail:

public

class mailsender implements

sender

}

sms:

public

class smslsender implements

sender

}

乙個測試中需要用到的檢查返回類:

public

class checkvalue implements

sender

}

最後,建工廠類:

public

class

sendfactory

if ("sms".equals(type))

return

newcheckvalue();}}

我們來測試一下

public

class

startfactory

}

輸出:

this is mail sender
多個方法

是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。關係圖:

將上面的**做下修改,改動下sendfactory類就行,如下:

public

class

sendfactory

sender producemail()

}

測試類如下:

public

class

startfactory

}

輸出結果如下:

this is mail sender
多個靜態方法

將上面的多個工廠方法模式裡的方法置為靜態的,不需要建立例項,直接呼叫即可:

public

class

sendfactory

static

sender producemail()

}

測試方法:

public

class

startfactory

}

輸出:

this is mail sender
總體來說,工廠模式適合:凡是出現了大量的產品需要建立,並且具有共同的介面時,可以通過工廠方法模式進行建立。在以上的三種模式中,第一種如果傳入的字串有誤,不能正確建立物件,第三種相對於第二種,不需要例項化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。

簡單工廠模式有乙個問題就是,類的建立依賴工廠類,也就是說,如果想要拓展程式,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的問題,如何解決?就用到工廠方法模式,建立乙個工廠介面和建立多個工廠實現類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的**。

觀察uml類圖 我們需要兩個介面他們分別是代表產品的,sender介面和代表工廠的provider介面 .

所以我們第一步還是先去建立介面,然後用類實現它.

介面 sender :
public

inte***ce

sender

兩個實現類:

mail:

public

class mailsender implements

sender

}

sms:
public

class smssender implements

sender

}

工廠介面 methodfactory :

public

inte***ce

methodfactory

兩個實現類:

mail:

public

class sendmailfactory implements

methodfactory

}

sms:

public

class sendsmsfactory implements

methodfactory

}

測試類:

public

class

startfactroy

}

輸出結果:

this sms factory method
其實這個模式的好處就是,如果你現在想增加乙個功能:發及時資訊,則只需做乙個實現類,實現sender介面,同時做乙個工廠類,實現provider介面,就ok了,無需去改動現成的**。這樣做,拓展性較好!

使用場景:

1、日誌記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日誌到什麼地方。 2、資料庫訪問,當使用者不知道最後系統採用哪一類資料庫,以及資料庫可能有變化時。 3、設計乙個連線伺服器的框架,需要三個協議,"pop3"、"imap"、"http",可以把這三個作為產品類,共同實現乙個介面。

注意事項:

作為一種建立類模式,在任何需要生成複雜物件的地方,都可以使用工廠方法模式。有一點需要注意的地方就是複雜物件適合使用工廠模式,而簡單物件,特別是只需要通過 new 就可以完成建立的物件,無需使用工廠模式。如果使用工廠模式,就需要引入乙個工廠類,會增加系統的複雜度。

工廠模式 簡單工廠和工廠方法

核心概念 實現了建立者和呼叫者分離 詳細分類 簡單 靜態工廠模式 工廠方法模式 抽象工廠模式 1.靜態工廠模式 public class ca ctory else if car.equals 特斯拉 else 方法2 每增加乙個類都要修改 不利於復用和維護 2.工廠方法模式 每個類分別實現ca c...

簡單工廠模式和工廠方法模式

在前面的部落格簡單工廠模式和策略模式的應用的前半部分,提到過簡單工廠模式,我們知道,簡單工廠模式的主要優點在於封裝了物件的建立過程,很大程度上實現了低耦合,但是,我們也能清晰的看到,當需要擴充套件新的功能時,我們不得不修改工廠類,這種做法實則違反了 開放 封閉 原則 為了解決這一問題,我們引入工廠方...

簡單工廠模式和工廠方法模式

簡單工廠模式又稱靜態工廠模式 簡單工廠模式的實質 乙個工廠類根據傳入的引數,動態決定應該建立哪一類產品類 這些產品類均繼承自乙個父類或介面 例項。比如使用者買車,要先去4s店就看車,4s店又要從車廠進貨。傳統方式 public inte ce carpublic class maserati imp...