java設計模式 工廠方法模式 抽象工廠模式

2021-08-21 06:21:54 字數 4091 閱讀 1992

工廠方法模式:

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

角色: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、替代單例模式。示例**:

/**

* 單例

**/public class singleton

public void dosomething()

}/**

* 單例工廠

**/public class singletonfactory catch (exception e)

}public static singleton getsingleton()

}

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

示例**(工廠方法改寫):

//容納已經建立的物件

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這種工廠只能生產雞肉這個系列的產品,而當需求發生變化時簡單工廠模式就無法應對了。例如 我再一...