工廠模式
目錄
- 何為工廠模式
- 工廠方法與抽象工廠
- 如何在Java EE中通過@Producers與@Inject注解實作工廠模式
-
如何建立自定義注解以及通過@Qualifier消除具體實作之間的歧義
工廠模式有兩種模式:工廠方法和抽象方法。它們的意圖是一樣的:提供一個接口,在不指定具體類的情況下建立相關或依賴的一系列對象。
一.何為工廠模式
工廠的目的在于建立對象。建立的邏輯被封裝在工廠中,要麼提供一個方法來傳回新建立的對象(工廠方法模式),要麼将對象的建立委托給子類(抽象工廠模式)。
用戶端不必考慮接口或類的不同實作,它隻需通過工廠(工廠)擷取接口實作的一個執行個體的即可,這樣用戶端與對象的建立就實作了解耦
解耦是應用依賴反轉原則的結果,這帶來了很多好處,其中最重要的好處就是實作了高層類與底層類之間的解耦。通過解耦,具體類實作的變化不會影響到用戶端,這降低了類與類之間的耦合,并提升了靈活性。
二.工廠方法
GoF一書是這樣描述工程方法模式的:“定義一個用于建立對象的接口,不過讓子類決定執行個體化那個類”
工廠極大降低了new關鍵字的使用次數,并且将初始化過程與不同的具體實作封裝起來。将這些需求中心化可以極大減少向系統中添加或删除具體類的影響以及具體的類依賴的影響。
1.使用普通代碼實作工廠方法
被具體實作繼承的DrinksMachine抽象類
public abstract class DrinksMachine {
public abstract Drink dispenseDrink();
public String displayMessage(){
return "Thank for your custom.";
}
}
DrinksMachine抽象類的CoffeeMachine實作
public class CoffeeMachine extends DrinksMachine {
public Drink dispenseDrink() {
return new Coffee();
}
}
DrinksMachine抽象類的SoftDrinksMachine實作
public class SoftDrinksMachine extends DrinksMachine {
public Drink dispenseDrink() {
return new SoftDrink();
}
}
Drink接口
public interface Drink {}
Drink接口的SoftDrink實作
public class SoftDrink implements Drink {
SoftDrink() {
System.out.println("Soft drink");
}
}
Drink接口的Coffee實作
public class Coffee implements Drink {
Coffee() {
System.out.println("Coffee");
}
}
CoffeeType枚舉
public enum CoffeeType {EXPRESSO, LATTE}
public Drink dispenseDrink(CoffeeType type) {
Drink coffee = null;
switch (type) {
case EXPRESSO: coffee = new Expresso();
case LATTE: coffee = new Latte();
}
return coffee;
}
三、抽象工廠
GoF中的描述為:提供一個接口來建立一系列相關或依賴的對象而不必指定具體類
抽象工廠接口
public interface AbstractDrinksMachineFactory {
public DrinksMachine createCoffeeMachine();
public DrinksMachine createSoftDrinksMachine();
}```
AbstractDrinksMachineFactorr的實作
```java
public class GourmetDrinksMachineFactory implements AbstractDrinksMachineFactory{
public DrinksMachine createCoffeeMachine() {
return new GourmetCoffeeMachine();
}
public DrinksMachine createSoftDrinksMachine() {
return new GourmetSoftDrinksMachine();
}
}
如果,您認為閱讀這篇部落格讓您有些收獲,不妨拿出手機【微信掃一掃】

您的資助是我最大的動力!
金額随意,歡迎來賞!