抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。来源:百度百科
我们依然沿着上次简单工厂走下去。
实现
我们将创建 Drinks 和 Taste 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 TasteFactory 和 DrinksFactory。
Step 1
创建Drinks和Taste接口
public interface Drinks {
void make();
}
public interface Taste {
void fill();
}
创建接口的实体类
这里只举两个例子:Coffee.java、Birtter.java
public class Coffee implements Drinks {
// 调用make方法
public Coffee() {
this.make();
}
@Override
public void make() {
System.out.println("泡一杯咖啡");
}
}
public class Bitter implements Taste{
// 调用fill方法
public Bitter() {
this.fill();
}
@Override
public void fill() {
System.out.println("苦的");
}
}
Step 3
为两个接口(Drinks、Taste)创建抽象类来获取工厂。
AbstractFactory.java
public abstract class AbstractFactory {
public abstract Drinks getDrinks (String drinks);
public abstract Taste getTaste (String taste);
}
Step 4
创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。
DrinksFactory.java & TasteFactory.java
public class DrinksFactory extends AbstractFactory {
// 使用getDrinks获取Drinks类型的对象
@Override
public Drinks getDrinks(String drinkType) {
if(drinkType == null) {
return null;
} else if (drinkType.equalsIgnoreCase("Coffee")) {
return new Coffee();
} else if (drinkType.equalsIgnoreCase("Juice")) {
return new Juice();
}
return null;
}
// 两个都必须要重写
@Override
public Taste getTaste(String taste) {
return null;
}
}
public class TasteFactory extends AbstractFactory{
@Override
public Drinks getDrinks(String drinks) {
return null;
}
@Override
public Taste getTaste(String tasteType) {
if(tasteType == null) {
return null;
} else if(tasteType.equalsIgnoreCase("Sour")) {
return new Sour();
} else if (tasteType.equalsIgnoreCase("Bitter")) {
return new Bitter();
}
return null;
}
}
Step 5
执行程序
public class Test {
public static void main(String[] args) {
AbstractFactory drinkTest = new DrinksFactory();
Drinks drink1 = drinkTest.getDrinks("Coffee"); // 获取Coffee对象
Drinks drink2 = drinkTest.getDrinks("Juice"); // 获取Juice方法
AbstractFactory tasteTest = new TasteFactory();
Taste taste1 = tasteTest.getTaste("Bitter");
Taste taste2 = tasteTest.getTaste("Sour");
}
}
输出结果
收获
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。