抽象工厂模式 是在工厂方法模式上的再一次抽取
- 将工厂方法模式中的公共方法提出,放入一个单独的类中
- 将抽象工厂父类 改为 接口,进一步的抽象
- 由各个子类去实现该接口中的抽象方法
这样工厂为一个对象簇,披萨为一个对象簇,工厂代码更容易维护。
在工厂方法模式不适用时,适合使用该模式,比如场景如下:
在工厂方法模式案例中,假设无法统一公共方法时,这样这些方法放到其他的一个类簇中,就不影响工厂簇了,实现低耦合=
实现例子:
工厂接口:
public interface AbsFactory {
//让下面的工厂子类来实现,具体实现
public 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);
}
public void orderPizza(String orderType) {
Pizza pizza = factory.createPizza(orderType);
if (pizza != null) {
//订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else{
//订购失败
System.out.println("订购失败!");
}
}
}
披萨类与工厂方法模式中的一致,这里就不重复写了