簡單定義###
定義一個用于創建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類的實例化延遲到其子類。
工廠方法(Factory Method)模式的意義###
是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
核心精神###
是封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、復用和方便后期維護拓展的目的。
工廠方法模式的類圖###
0_1331817716F3IJ.gif.jpg
工廠方法模式有四個要素###
工廠接口:工廠接口是工廠方法模式的核心,與調用者直接交互用來提供產品。在實際編程中,有時候也會使用一個抽象類來作為與調用者交互的接口,其本質上是一樣的。
工廠實現:在編程中,工廠實現決定如何實例化產品,是實現擴展的途徑,需要有多少種產品,就需要有多少個具體的工廠實現。
產品接口:產品接口的主要目的是定義產品的規范,所有的產品實現都必須遵循產品接口定義的規范。產品接口是調用者最為關心的,產品接口定義的優劣直接決定了調用者代碼的穩定性。同樣,產品接口也可以用抽象類來代替,但要注意最好不要違反里氏替換原則。
產品實現:實現產品接口的具體類,決定了產品在客戶端中的具體行為。
比如,造汽車
如果不用工廠方法
class Engine {
public void getStyle(){
System.out.println("這是汽車的發動機");
}
}
class Underpan {
public void getStyle(){
System.out.println("這是汽車的底盤");
}
}
class Wheel {
public void getStyle(){
System.out.println("這是汽車的輪胎");
}
}
public class Client {
public static void main(String[] args) {
Engine engine = new Engine();
Underpan underpan = new Underpan();
Wheel wheel = new Wheel();
ICar car = new Car(underpan, wheel, engine);
car.show();
}
}
調用者為了組裝汽車還需要另外實例化發動機、底盤和輪胎,而這些汽車的組件是與調用者無關的,嚴重違反了###迪米特法則(上一篇文章說過)###,耦合度太高。并且非常不利于擴展。
使用工廠方法后
interface IFactory {
public ICar createCar();
}
class Factory implements IFactory {
public ICar createCar() {
Engine engine = new Engine();
Underpan underpan = new Underpan();
Wheel wheel = new Wheel();
ICar car = new Car(underpan, wheel, engine);
return car;
}
}
public class Client {
public static void main(String[] args) {
IFactory factory = new Factory();
ICar car = factory.createCar();
car.show();
}
}
相關應用###
許多web主流框架的DAO層
jdbc等等