工廠方法模式:
定義乙個用於建立物件的介面, 讓子類決定例項化哪乙個類。 工廠方法使乙個類的例項化延遲到其子類。
角色:product 抽象產品,負責定義產品的共性,實現對事物抽象的定義
creator 抽象建立類,也就是抽象工廠,具體如何建立產品類是由具體的實現工廠完成
concretecreator 具體實現工廠
總結一下模板**:
實際中往裡面套就可以了,產品也可能是抽象類,也可能是乙個具體的類(萬物皆物件嘛)等等可以根據自己的需要修改。/**
* 產品抽象
*/public inte***ce product
/** * 具體產品
*/public class concreteproduct1 implements product
}/**
* 抽象工廠類
* */
public inte***ce creator
/** * 抽象工廠實現
*/public class concretecreator implements creator catch (exception e)
return (t)product;
}}//測試**:
public static void main(string args)
優點:上層不用關心具體的產品是怎麼實現的,只要知道用那一種產品就行。
呼叫者不需要知道產品如何實現。
有新的產品了,只要產品介面不變,那麼所有的上層呼叫都不用變。唯一要變的可能就是具體工廠的實現(模板**中,都不需要修改)。
工廠方法模式的擴充套件:
1、 模板**中。只需要乙個工廠 concretecreator 例項,所以就沒有必要把它new出來,建立物件方法使用靜態方法就可以。
2、每乙個產品有乙個產品工廠。適用於產品比較多,每個產品的初始化方法都不相同(不僅僅是new),如果寫在乙個產品工廠中那麼此工廠可能會比較大(方法**多)。為了結構清晰,為每乙個產品建立乙個工廠類,讓呼叫者自己去選擇使用那乙個工廠。
3、替代單例模式。示例**:
4、延遲初始化。乙個物件被消費完畢後, 並不立刻釋放, 工廠類保持其初始狀態, 等待再次被使用。 延遲初始化是工廠方法模式的乙個擴充套件應用。/**
* 單例
**/public class singleton
public void dosomething()
}/**
* 單例工廠
**/public class singletonfactory catch (exception e)
}public static singleton getsingleton()
}
示例**(工廠方法改寫):
上面都是模板**,一切皆可擴充套件。工廠方法模式在專案中用的比較多,多思考如何使用,而且很容易與其它模式混合使用。//容納已經建立的物件
private static mapmap = new hashmap<>(16);
//工廠方法
public static synchronized t create(classc)
try catch (exception e)
return (t)product;
}
抽象工廠模式
工廠方法模式就是單獨生產某乙個單獨具體的產品,產品之間聯絡。在實際的工廠中,分為很多車間,每個車間又分為多個生產線,分別生產不同的產品,生產完畢就可以在系統外組裝,各個車間和生產線的職責非常明確,在車間內各個生產出來的產品可以有耦合關係,生產的時候在乙個車間內協調好。這就是抽象工廠模式。
定義:為建立一組相關或相互依賴的物件提供乙個介面, 而且無須指定它們的具體類。
抽象工廠模式是工廠方法模式的公升級版本, 在有多個業務品種、 業務分類時, 通過抽象工廠模式產生需要的物件是一種非常好的解決方式。 比如:生產車輛的左側車門和右側車門,這兩個應該是數量相等的(產品之間的約束),叫做產品族。每種車型車門都是不一樣的,這是產品等級結構約束。
示例:生產車門,一輛車有左側門和右門。uml 圖如下:
注:左側門和右側門是兩個產品族, leftdoor benzleftdoor bmwleftdoor 為同乙個產品等級,rightdoor benzrightdoor bmwrightdoor 為同乙個產品等級。
**:door類及其子類
工廠類/**
* 車門抽象類
*/public abstract class door
public void close()
/*** 車門型別,左側門還是右側門
*/public abstract void type();
/*** 子類實現
*/public abstract void other();
}/**
* 左側門
*/public abstract class leftdoor extends door
}/**
* 右側門
*/public abstract class rightdoor extends door
}/**
* benz 左側門
*/public class benzleftdoor extends leftdoor
}/**
* benz 左側門
*/public class benzrightdoor extends rightdoor
}/**
* bmw 車輛左側門
*/public class bmwleftdoor extends leftdoor
}/**
* bmw 車輛右側門
*/public class bmwrightdoor extends rightdoor
}
測試**:/**
* 抽象車門建立者
*/public abstract class abstractdoorcreator
/** * bmw 車門建立者
*/public class bmwdoorcreator extends abstractdoorcreator
@override
public rightdoor createrightdoor()
}/**
* benz 車門建立者
*/public class benzdoorcreator extends abstractdoorcreator
@override
public rightdoor createrightdoor()
}
public static void main(string args)
優點:
封裝性,呼叫者只要關心介面(抽象類)就行,只要知道具體的工廠,就能生產出想要的產品。
產品內部的約束不公開,由工廠內部實現比如生產乙個左側門就要對應乙個右側門。
缺點:產品族擴充套件困難,比如要加乙個天窗門,那麼修改的類就多了,工廠介面都需要修改。比如:新增了乙個天窗的門,那麼 abstractdoorcreator 抽象類就要加乙個生產天窗門的方法,整個**都需要修改。
注意是產品族擴充套件困難不是產品等級,增加乙個產品等級只要新增乙個產品工廠就可以了。比如新增了乙個大眾的車門,那麼新增乙個大眾的車門工廠就行。
使用場景:
乙個物件族(或者一組沒有關係的物件),都有相同的約束條件。如:乙個文字編輯器和乙個編輯器,兩者沒有關係,但是都要在windows系統和linux系統上使用,那麼它們就有了同乙個約束條件:作業系統。所以就可能使用抽象工廠模式,生產不同作業系統下的編輯器和處理器。
注:以上為模板**,按照自己的專案可以修改。比如:車門工廠定義為 生產左側門工廠和右側門工廠,然後工廠類就是專用生產左側門和右側門的工廠類。
Java設計模式 工廠方法模式
定義乙個用於建立物件的介面,讓子類決定將哪乙個類例項化。factory method 使乙個類的例項化延遲到其子類。package car inte ce public inte ce icar inte ce package car imple import car inte ce.icar in...
Java設計模式 工廠方法模式
工廠方法模式應用背景 客戶類不關心使用哪個具體的類,只關心介面所提供的功能。建立過程比較複雜,例如需要初始化其他關聯的資源類。介面或者抽象類有許多實現類,客戶 需要編寫大量if else邏輯來決定執行時使用哪個具體的實現類。不希望給客戶程式暴露太多的類的內部結構,這樣做可以降低耦合度。優化效能,比如...
java設計模式 工廠方法模式
簡單工廠模式的應用就是用來建立乙個物件,簡單工廠模式是將所有物件的初始化集於乙個具體的工廠類來實現,這個工廠類負責所有產品的建立,但是這種建立只能建立單一的產品,如簡單工廠模式裡的chickenfactory這種工廠只能生產雞肉這個系列的產品,而當需求發生變化時簡單工廠模式就無法應對了。例如 我再一...