工厂模式
目录
- 何为工厂模式
- 工厂方法与抽象工厂
- 如何在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();
}
}