工廠方法模式

2021-08-10 04:44:35 字數 4712 閱讀 1577

定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲至其子類。

工廠方法模式的通用類圖如下:

抽象產品類product負責定義產品的共性,實現對事物最抽象的定義:creator為抽象建立類,也就是抽象工廠,具體如何建立產品類是由具體的實現工廠concretecreator完成的。讓我們來看乙個比較實用的通用原始碼:

抽象產品類:

/**

* 抽象產品類

*/public

abstract

class

product

//抽象方法

public

abstract

void

method2();

}

具體產品類:

/**

* 具體產品類1

*/public

class

concreteproduct1

extends

product

}/**

* 具體產品類2

*/public

class

concreteproduct2

extends

product

}

抽象工廠類:

/**

* 抽象工廠類

*/public

abstract

class

creator

具體工廠類:

/**

* 具體工廠類

*/public

class

concretecreator

extends

creator catch (exception e)

return (t) product;}}

場景類:

/**

* 場景類

*/public

class

client

}

工廠方法模式的優點

工廠方法模式的使用場景

通過工廠方法模式來實現女媧造人,生產各種人種。**如下:

人類總稱:

/**

* 人類總稱

*/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

}

縮小為簡單工廠模式
乙個模組僅需要乙個工廠類,沒有必要把它生產出來,使用靜態的方法就可以了。

**如下:

簡單工廠模式中的工廠類:

/**

* 簡單工廠模式中斷工廠類

*/public

class

humanfactory catch (exception e)

return (t) human;}}

humanfactory類僅有兩個地方發生變化:去掉繼承抽象類,並在createhuman前增加static關鍵字。

簡單工廠模式中的場景類:

public

class nvwa

}

執行結果沒有變化,但是類圖和呼叫者也簡化了,該模式是工廠方法模式的弱化,以為簡單,所以稱為簡單工廠模式(****** factory pattern),也叫做靜態工廠模式

公升級為多個工廠類

當我們在做乙個比較複雜的專案的時候,經常會遇到初始化乙個物件很耗費精力的情況,所有的產品類都放到乙個工廠方法中進行初始化會使**結構不清晰。為此,我們就為每乙個產品定義乙個創造者,然後由呼叫者自己去選擇與哪個工廠方法關聯。

多工廠模式的抽象工廠類:

/**

* 多工廠模式的抽象工廠類

*/public

abstract

class

abstracthumanfactory

人種的建立工廠實現:

/**

* 黑色人種的建立工廠實現

*/public

class

blackhumanfactory

extends

abstracthumanfactory

}//...

場景類nvwa

/**

* 場景類nvwa

*/public

class

nvwa

}

每乙個產品類都對應了乙個建立類,好處就是建立類的職責清晰,而且結構簡單,但是給可擴充套件性和可維護性帶來了一定的影響。因為如果要擴充套件乙個產品類,就需要建立乙個相應的工廠類,這樣就增加了擴充套件的難度。

當然,在複雜的應用中一般採用多工廠模式,然後再增加乙個協調類,避免呼叫者與各個子工廠交流,協調類的作用是封裝子工廠類,對高層模組提供統一的訪問介面。

替代單例模式

通過工廠方法模式實現只在記憶體中生產乙個物件。

**定義如下:

單例類:

/**

* 單例類

*/public

class

singleton

public

void

dosomething()

}

負責生成單例的工廠類:

/**

* 負責生成單例的工廠類

*/public

class

singletonfactory catch (exception e)

}public

static singleton getsingleton()

}

以上通過工廠方法模式建立了乙個單例物件,該框架可以繼續擴充套件,在乙個專案中可以產生乙個單例構造器,所有需要產生單例的類都遵循一定的規則(構造方法是private),然後通過擴充套件該框架,只需要輸入乙個型別就可以獲得唯一的乙個例項。

延遲初始化

延遲初始化(lazy initialization)意為乙個物件被消費完畢後,並不立刻釋放,工廠類保持其初始狀態,等待再次被使用。延遲初始化是工廠方法模式的乙個擴充套件應用

其**如下:

延遲載入的工廠類:

/**

* 延遲載入的工廠類

*/public

class

productfactory else else

map.put(type, human);

}return human;}}

延遲載入框架是可以擴充套件的,錄入限制某個產品的最大例項化的數量,可以通過判定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 ...