靜態工廠 vs 建構函式,優缺點

2021-04-14 02:01:39 字數 1372 閱讀 2887

靜態工廠是指用乙個靜態函式返回乙個例項,乙個典型的例子就是graphics類,例如:

public

static

graphics

fromhdc

(intptr

hdc);

public

static

graphics

fromhwnd

(intptr

hwnd);

public

static

graphics

fromimage

(image

image);

graphics類沒有提供公開的的建構函式,必須用這些靜態函式的構造物件。建構函式跟靜態工廠都是生成例項的一種設計,靜態工廠有什麼優缺點?

靜態工廠的優點:

1、可以提供很直觀、具有描述性的函式名稱,例如上面的例子,一看就知道用什麼型別的資料建立graphics物件。

2、乙個類不能有兩個簽名一樣的的建構函式,即不能引數型別跟排列一樣的建構函式。上面例子中,兩個函式的引數都是intptr,不會混淆。

3、可以返回相同的、已經存在例項,提高重用性,提高效能。乙個典型的例子是brushs.red屬性,返回乙個紅色的solidbrush

例項。4、既可以返回派生類物件,也可以返回基類物件,或者說可以返回任何東西。例如 brushs.red屬性的返回型別是brush,雖然內部構建的是solidbrush

。靜態工廠的缺點:

1、如果只提供靜態工廠的方法,不提供公開的建構函式,則這個工廠不能具有派生類,即變成乙個sealed 類了。(其實這個可以是個優點,更高的封裝性)

2、建構函式跟類名具有一樣的名字,使得人一看到它就知道是建構函式,靜態工廠的函式沒有這個特點。

最後說說brushs這個畫刷工廠,乙個容易使用錯的地方,例如:

brush b1 = brushes.red;

b1.dispose();

brush b2 = brushes.red;

這會導致第二次取得的brush b2不能用,因為b1、b2都是指向同乙個物件,已經被dispose()了。

所以使用完brushes工廠的生成的brush,不能呼叫dispose()釋放,要主動釋放就自己生成brush。

我們再看看例如brushs.red是怎麼實現的:

public static brush red

return brush;}}

safenativemethods.threaddata是乙個 idictionary

的實現。

能看明白這個實現,就明白為什麼了。

技術討論的qq群: 2514097 或 10987609 

靜態工廠方法代替建構函式的優缺點

優點 1.與建構函式不同,靜態工廠方法具有名字。這個好處可以幫助我們擺脫乙個類只能有乙個原型相同的建構函式的限制。2.與建構函式不同,靜態工廠方法每次被呼叫的時候,不要求非得建立乙個新的物件 signleton 模式 3.與建構函式不同,他們可以返回乙個原返回型別的子型別物件 服務提供者框架的基礎 ...

c 拷貝建構函式優缺點

前一段時間去面試,被人問了乙個這個問題,突然不知道怎麼回答了,後來查了查,才知道原來是怎麼樣了,現在總結一下吧。拷貝建構函式和賦值運算子用於建立物件的副本。在某些情況下由編譯器隱式呼叫拷貝建構函式,例如按值傳遞物件的時候。優點 拷貝建構函式可以很容易地複製物件。stl容器要求所有內容可拷貝和賦值。拷...

c 拷貝建構函式優缺點

c 拷貝建構函式優缺點 前一段時間去面試,被人問了乙個這個問題,突然不知道怎麼回答了,後來查了查,才知道原來是怎麼樣了,現在總結一下吧。拷貝建構函式和賦值運算子用於建立物件的副本。在某些情況下由編譯器隱式呼叫拷貝建構函式,例如按值傳遞物件的時候。優點 拷貝建構函式可以很容易地複製物件。stl容器要求...