4.抽象工厂模式
抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
从设计层面看,抽象工厂模式就是对简单工厂模式的改进( 或者称为进一步的抽象 ) 。将工厂抽象成两层,AbsFactory( 抽象工厂 ) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了 工厂簇 , 更利于代码的维护和扩展。
理解
抽象工厂模式是在简单工厂模式的基础上进行的改进。与上一节的工厂方法模式最大的区别是将抽象的工厂类接口化,将具体的业务逻辑移动到上层(Order)。
UML类图的对比
将业务逻辑移动到Order层后,就实现了工厂层与Order层的分离。
代码改动(工厂方法模式的基础上)
//两个工厂子类变成实现接口
//AbsFactory.java
//原来的Factory变为AbsFactory接口
public interface AbsFactory {
//创建生产面包的create方法
public Bread createBread(String type);
}
//Order.java
//Order类完成业务逻辑
public class Order {
static AbsFactory absFactory;
public static void main(String[] args) {
String address = getType();
//根据用户地点去相应的工厂制作面包
if ("BJ".equalsIgnoreCase(address)) {
absFactory = new BJFactory();
} else if ("TJ".equalsIgnoreCase(address)) {
absFactory = new TJFactory();
}
if (absFactory != null) {
orderBread();
}
}
public static void orderBread() {
while (true) {
//调用函数生产面包
Bread bread = absFactory.createBread(getType());
//输出面包的订购过程
if (bread != null) {
bread.prepare();
bread.bake();
bread.pack();
System.out.println("----------------------------");
} else {
System.out.println("订购失败");
break;
}
}
}
//可以获取客户的地点信息,就是从控制台上获取输入数据
private static String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input Address:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}