定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲至其子類。工廠方法模式的通用類圖如下:
抽象產品類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 ...