demo还是上篇博文的demo,Pizza还是之前的Pizza,变化的代码如下:
多了个工厂接口和两个工厂类:
public interface AbsFactory {
//让工厂子类去具体实现
Pizza createPizza(String orderType);
}
public class BJFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
Pizza pizza=null;
if (orderType.equals("cheese")){
pizza=new BJCheesePizza();
}else if (orderType.equals("pepper")){
pizza=new BJPepperPizza();
}
return pizza;
}
}
public class LDFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
Pizza pizza=null;
if (orderType.equals("cheese")){
pizza=new LDCheesePizza();
}else if (orderType.equals("pepper")){
pizza=new LDPepperPizza();
}
return pizza;
}
}
OrderPizza类由抽象类变成了普通类,将抽象方法提取到了接口里,聚合接口:
public class OrderPizza {
AbsFactory factory;
public OrderPizza(AbsFactory factory){
setFactory(factory);
}
private void setFactory(AbsFactory factory) {
Pizza pizza = null;
String orderType = "";
this.factory = factory;
do {
orderType = getType();
pizza = factory.createPizza(orderType);
if (pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("订购披萨失败");
break;
}
} while (true);
}
private String getType() {
try {
BufferedReader strin =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入披萨口味:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
客户端:
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza(new BJFactory());
}
}
demo类图:
类图分析:
看到这个类图,大家有没有对面向接口编程有更新的认识,写到这我是感触挺深刻的
相比工厂方法,抽象工厂将工厂更具体化了,拖给接口管理,如果扩展的话同样在1、2位置可双向扩展
适用场景:同工厂方法
总结:将要使用的类作为目标产品,对产品的一些附加方法或操作当作描述。当产品的描述复杂时,可以采用工厂来分离对象的实例化与调用,使用者不用关心对象是如何被描述的;当产品的种类多,一般每次用其中的一类时,可将产品托给工厂管理,这样可以不用记复杂的命名,减轻调用的负担。