設計模式必知必會 三種工廠方法之對比

2021-08-16 10:57:53 字數 2896 閱讀 6876

在開發中,有沒有試過使用工廠方法呢,不同的工廠方法之間又有什麼不同呢,今天就來好好講一講。本文假設讀者都已經了解了三種工廠方法,所以對三種工廠方法的細節不再贅述。

首先我們總共有三種工廠:

簡單工廠模式

工廠方法模式

靜態工廠模式

有什麼不同?看**:

簡單工廠模式

class

father

class

childa

extends

father

class

childb

extends

father

class

childfactory

return

null;

}}

是不是很清晰,我們只要呼叫工廠的iwantchild方法,就可以實現創造出不同的子類,使用起來非常方便。

工廠方法模式

在來看看工廠方法模式:

class

father

class

childa

extends

father

class

childb

extends

father

inte***ce

ifactory

class

afactory

implements

ifactory

}class

bfactory

implements

ifactory

}

看上去兩種工廠方法沒有什麼不同呀,為什麼要這麼使用呢?讓我們來細細思考,從定義上看似乎沒有什麼問題,現在是只有childa和childb兩個,假如現在我們需要childc了,該怎麼改呢?

對於簡單工廠模式,我們需要做什麼,沒錯,就是去對工廠childfactory的iwantchild方法進行修改,新增乙個新的分支,同時新建乙個新的childc類並且這個類繼承於father類,不難對吧,但是如果我們是寫庫給別人用,且不希望別人修改我們的**,那麼別人要如何去生成新的childc類呢,難道還是使用new childc嗎,這就非常不好了。

對於工廠方法模式,我們需要做什麼呢,簡單,繼承ifactory實現childc的工廠,同時繼承father,實現新的childc類,使用上非常方便,且不需要去修改原有的**。很好。

靜態工廠方法

**如下:

class

father

class

childa

extends

father

class

childb

extends

father

class

childfactory

public

static father iwantchildb()

}

看起來感覺上是不是很多餘,相對於工廠方法模式,似乎還少了一些可擴充套件性,但是別忘了,靜態工廠的使用場景與上面兩種工廠方法的使用場景是不完全相同的,在特定的使用場景下,相信你也會更傾向於使用靜態工廠的。

不管這些,從上面的**中,靜態工廠有什麼優勢?第

一、我們可以返回任何子型別的物件;第

二、我們在建立引數化的例項時,**更加簡潔,例如上面的,只需要呼叫靜態工廠方法,而不需要去填寫引數;另外還有呢?對的,有名字,這個特點比起工廠方法似乎沒什麼優勢,這是因為上面這種寫法不夠直觀,看看下面這種寫法:

class child 

public

static child childa()

public

static child childb()

}

看,這種寫法可以有效的按照要求生成類,同時我們可以隱藏我們的構造器,讓外界的呼叫只能基於靜態工廠,而不能呼叫到我們的構造器,安全性更好,且這種寫法不需要每次都建立新的物件,讓物件的建立都掌握在我們的手中:

class child 

public

static child childa()

child.ch = 'a';

return child;

}public

static child childb()

child.ch = 'b';

return child;

}}

但是靜態工廠方法有沒有什麼侷限呢?看上面這段**就明白了,如果構造器不是公有的或者可繼承的,那麼我們就無法建立子類。

另外還有乙個極其嚴重的例項,假如使用者在新建這個類例項的時候,需要傳遞30個引數,那麼我們該怎麼辦?當然30個是有點多了,也正好可以說明問題,傳遞30個引數,很容易就導致引數的傳遞錯誤,非常不好的體驗,尤其是幾個引數型別什麼的都一樣,僅僅是功能不同,那麼就會導致程式無法執行出正確的結果。

有沒有解決辦法?

builder模式

class child 

public

static

class builder

public child build()

}}

如上所示,我們只向外界暴露我們的建造器builder,builder通過set方法設定引數,這樣我們就可以通過set的名字來相應的設定不同的引數,最後在builder中統一呼叫建構函式進行返回,就不容易出錯了。同時,我們也可以在set的時候進行判斷和提示,在build中根據引數的不同返回子類,使用上非常方便。有沒有問題?有的,問題還是有的,在我們的**中,就相當於需要兩個ch,如果引數很多很長,且引數占用的空間比較大,那麼就容易導致浪費。不過這種模式還是很常用的。

本文比較了三種工廠方法,對不同的工廠方法的使用做了一定的說明,還是那句話,根據自己的應用場景來進行選擇,適合的才是最好的。

23種設計模式之工廠方法模式

定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,工廠方法使乙個類的例項化延遲到其子類。型別 建立類模式 類圖 inte ce iproduct class product implements iproduct inte ce ifactory class factory impleme...

23種設計模式之工廠方法模式

定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類.工廠方法使乙個類的例項化延遲到其子類 工廠方法模式的通用類圖 其中 product 負責產品的共性,實現對事物最抽象的定義 creator 為抽象建立類,也就是抽象工廠,具體如何建立產品類是由具體的實現工廠 concretecreator ...

23種設計模式之工廠方法模式

工廠方法 factorymethod 模式定義 定義乙個建立產品物件的工廠介面,將產品物件的實際建立工作推遲到具體子工廠類當中,滿足建立型模式中所要求的 建立與使用相分離 的特點。如果建立的產品 物件 不多,只有乙個工廠類就可以的話,這種模式稱為 簡單工廠模式 但它不屬於23中設計模式,因為增加產品...