概述
- 抽象工厂模式定义一个interface用于创建相关或者有依赖关系的对象簇,而无需指明具体的类
- 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合
- 抽象工厂模式是简单工厂模式的改进(进一步抽象)
- 将工厂抽象成两层,AbstractFactory和集体实现的工厂子类,程序员可以根据创建对象类型使用对应的工厂子类,这样将单个的简单工厂变成工厂簇,更利于代码的维护和扩展。
实例
Pizza抽象类
public abstract class Pizza {
protected String name;//具体的名字
public abstract void prepare();//准备原材料,不同的pizza是不一样的,这里可以继承
public void bake(){
System.out.println(name + "baking");
}
public void cut(){
System.out.println(name + "cutting");
}
public void box(){
System.out.println(name + "boxing");
}
public void setName(String name) {
this.name = name;
}
}
继承Pizza的具体Pizza类
public class LDGreekPizza extends Pizza {
@Override
public void prepare() {
setName("伦敦Greek披萨");
System.out.println("伦敦Greek披萨 准备原材料");
}
}
public class LDCheesePizza extends Pizza {
@Override
public void prepare() {
setName("伦敦奶酪披萨");
System.out.println("伦敦的奶酪披萨 准备原材料");
}
}
public class BJGreekPizza extends Pizza {
@Override
public void prepare() {
setName("北京Greek披萨");
System.out.println("北京Greek披萨 准备原材料");
}
}
public class BJCheesePizza extends Pizza {
@Override
public void prepare() {
setName("北京奶酪披萨");
System.out.println("北京的奶酪披萨 准备原材料");
}
}
定义工厂接口
//一个抽象工厂模式的抽象层(接口)
public interface AbsFactory {
public abstract Pizza createPizza(String orderType);
}
具体的工厂实现类,对应不同类型的Pizza
public class BJFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
System.out.println("使用抽象工厂模式");
Pizza pizza = null;
if(orderType.equals("cheese")){
pizza = new BJCheesePizza();
}else if (orderType.equals("greek")){
pizza = new BJGreekPizza();
}
return pizza;
}
}
public class LDFactory implements AbsFactory{
@Override
public Pizza createPizza(String orderType) {
System.out.println("使用抽象工厂模式");
Pizza pizza = null;
if(orderType.equals("cheese")){
pizza = new LDCheesePizza();
}else if (orderType.equals("greek")){
pizza = new LDGreekPizza();
}
return pizza;
}
}
通过OrderPizza联系工厂进行订购Pizza,达到解耦的效果
public class orderPizza {
AbsFactory absFactory;
public orderPizza(AbsFactory absFactory){
setFactory(absFactory);
}
public void setFactory(AbsFactory absFactory){
this.absFactory = absFactory;//将当前的工厂设置为指定工厂
Pizza pizza = null;
String orderType = "";//用户指定的类型
do{
orderType = getType();
pizza = absFactory.createPizza(orderType);
if(pizza!=null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else{
System.out.println("订购失败");
break;
}
}while(true);
}
//获取Pizza类型
private String getType(){
Scanner scan = new Scanner(System.in);
String type = scan.next();
return type;
}
}
Pizza订购商店,通过不同类型的工厂订购Pizza
public class PizzaStore {
public static void main(String[] args) {
new orderPizza(new BJFactory());
}
}
抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干