一,何为工厂?
工厂模式有两种形式:工厂方法与抽象工厂。它们的意图是一样的:提供一个接口,在不指定具体类的情况下创建相关或依赖的一系列对象
工厂的目的在于创建对象。创建的逻辑被封装在工厂中,要么提供一个方法来返回新创建的对象(工厂方法模式),要么将对象的创建委托给子类(抽象工厂模式)。无论哪种情况,对象的创建都从对象的使用中抽离处理了
通常来说,工厂本身会被实现为单列或是静态类,因为一般来说只需要一个工厂实例即可。这么做会将工厂对象的创建集中到一个地方,对代码进行修改和更新时有利于更好地组织和维护,并减少了错误
Java EE中,依赖注入用于在实现工厂模式时解耦高层类与底层类。注解@Producers与@Inject的组合使用使得实现变得相当简单
二,工厂方法
工厂极大降低了new关键字的使用次数,并且将初始化过程与不同的具体实现封装了起来。将这些需求中心化可以极大减少向系统中添加或删除具体类的影响以及具体的类的依赖的影响。
使用普通代码实现工厂方法
//抽象类
public abstract class DrinksMachine{
public abstract Drink dispenseDrink();
public String displayMessage(){
return "Thank for your custom";
}
}
//抽象类的实现1
public class CoffeeMachine extends DrinkMachine{
public Drink dispenseDrink(){
return new Coffee();
}
}
//抽象类的实现2
public class SoftDrinkMachine extends DrinkMachine{
public Drink dispenseDrink(){
return new SoftDrink();
}
}
//Drink 接口
public interface Drink(){}
//Drink接口的实现1
public class SoftDrink implements Drink(){
SoftDrink(){
System.out.println("SoftDrink");
}
}
//Drink接口的实现2
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;
}
抽象工厂
//抽象工厂接口
public interface ADrinksMachineFactory{
public DrinkMachine createCoffeeMachine();
public DrinkMachine createSoftDrinkMachine();
}
//抽象工厂实现
public DrinkMachineFactory implements ADrinksMachineFactory(){
public DrinkMachine createCoffeeMachine(){
return new CoffeeMachine();
}
public DrinkMachine createSoftDrinkMachine(){
return new SoftDrinksMachine();
}
}
//示例
ADrinksMachineFactory factory = new DrinkMachineFactory();
DinrkMachine coffeemachine = factrory.createCoffeeMachine();
coffeemachine.dispenseDrink(CoffeeType.EXPRESSO);