工廠方法模式

2021-08-19 11:43:06 字數 4526 閱讀 6896

定義:

定義了乙個建立物件的介面,但是由子類來決定要例項化的是哪乙個類。工廠方法使類的例項化延遲到子類中。

通用類圖:

工廠方法中的角色:

通用**示例:

public

abstract

class

product

public

abstract

void

method2()

;}

public

class

concreteproducta

extends

product

}

public

class

concreteproductb

extends

product

}

public

abstract

class

creator

public

class

concretecreator

extends

creator

catch

(exception e)

return

(t)product;

}}

public

class

client

}

舉例東漢《風俗通》記載:「開天闢地,未有人民,女媧搏黃土做人」,講的就是女媧造人的神話故事,開天闢地之處,大地上並沒有生物,只有蒼茫大地,潔淨的自然環境,寂靜又寂寞,女媧決定創造新的物種來增加世界的繁榮。於是女媧採集黃土,捏**形,放入八卦爐中燒製,然後放置於大地上生長,人類便誕生了。

在這個過程當中人類就是product角色,八卦爐就是工廠類角色,人類分為白種人、黑種人、黃種人,類圖設計如下:

實現**:

public

inte***ce

human

public

class

blackhuman

implements

human

@override

public

void

talk()

}

public

class

whitehuman

implements

human

@override

public

void

talk()

}

public

class

yellowhuman

implements

human

@override

public

void

talk()

}

/**

* 抽象人類工廠

*/public

abstract

class

abstracthumanfactory

/**

* 人類工廠實現類

*/public

class

humanfactory

extends

abstracthumanfactory

catch

(exception e)

return

(t) human;

}}

public

class

nvwa

}

工廠方法模式的優缺點工廠方法模式具有非常好的擴充套件性,在抽象工廠基類中指定了建立物件的約束方法,但不提供建立過程,而是由子類去實現創造過程,跟具體的產品實現類完全解耦,工廠高層模組和低層模組嚴格依賴抽象,符合依賴倒置原則,同時也符合迪公尺特法則(呼叫者減少和具體產品類打交道)和裡式替換原則(產品子類替換產品父類不會有問題)。

工廠方法模式也有缺點,那就是建立乙個類的物件需要另乙個類來進行管理,增加**的複雜度。所以在選擇工廠方法模式的時候要注意取捨,如果使用new建立的物件就可以滿足需求的話就不需要工廠方法模式,如果你需要的是可靈活性擴充套件的框架可以考慮工廠方法模式。

簡單工廠模式

如果實際當中只需要乙個工廠類,那麼就不需要抽象的工廠基類,可以把建立產品的方法改為靜態方法。

女媧造人例子的修改為簡單工廠:

public

class

humanfactory

catch

(exception e)

return

(t) human;

}}

public

class

nvwa

}

**變的比前面簡單的多,簡單工廠看上去像乙個工具類方法,雖然它失去了可擴充套件性不符合開閉原則,但是卻比較實用,這需要根據你的需求當你確定模組中只需要乙個工廠類時採用。

多個工廠類

在實際當中如果初始化建立物件的過程比較複雜,比如不同的產品可能會設定不同的引數,這個時候建立產品的方法不能共用,所以這時就需要為每乙個產品類建立乙個工廠類。

女媧造人例子的修改為多工廠類:

public

abstract

class

abstracthumanfactory

public

class

blackhumanfactory

extends

abstracthumanfactory

}

public

class

whitehumanfactory

extends

abstracthumanfactory

}

public

class

yellowhumanfactory

extends

abstracthumanfactory

}

public

class

nvwa

}

多工廠職責比較清晰簡單,但是也有缺點就是降低可維護性,因為產品類和工廠類數量相同,每增加乙個產品類就需要增加乙個工廠類。

可生成單例模式的工廠類

既然工廠方法是用來生產物件的,那麼就可以對工廠方法做簡單的修改,只返回乙個物件,就變成了單例模式:

/**

* 單例類

*/public

class

singleton

public

void

dosomething()

}

public

class

singletonfactory

catch

(exception e)

}public

static singleton getsingleton()

}

**中工廠類利用反射生成了乙個單例模式的物件。

可復用快取的工廠類

如果建立物件的過程比較複雜,或者非常耗時,可以在工廠類內部對已建立的物件進行快取,以備下次使用。

public

class

productfactory

else

else

//把建立的物件快取起來

productmap.

put(type, product);}

return product;

}}

**中建立了乙個map物件來快取產品物件,當建立產品物件的時候,同時將產品物件快取到map當中,這樣當下次再次需要獲取產品物件的時候,如果map當中有快取就直接從map中獲取。

這樣的好處是,如果產品物件的建立過程比較複雜耗時,就可以加快互動過程,不需要等待建立完畢,直接使用已建立好的物件,還有乙個好處是可以控制最大產品數量,當產品類物件需要占用很高的記憶體時,這會非常有用,它可以節約和限制你的記憶體使用。

參考:

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...

工廠方法模式 工廠方法模式 二

工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...

工廠方法模式(一) 簡單工廠方法模式

ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...