在工厂方法基础上,将工厂的生产方法的返回类型从具体产品抽象为抽象产品,同时扩展工厂的方法,支持任意定制产品族,则工厂方法可以升级为抽象工厂模式,比如一家餐厅可以提供牛排(方法A),红酒(方法B),蔬菜汤(方法C),另一个餐厅可以提供水煮鱼,橙汁,乌鸡汤。
抽象产品类:
/** * 主菜抽象类 */ public abstract class MainCourse { abstract void printName(); }
public abstract class Drink { abstract void printFlavor(); }
public abstract class Soup { abstract void printContent(); }
抽象工厂类:
public abstract class AbstractFactory { abstract MainCourse supplyFood(); abstract Drink supplyDrink(); abstract Soup supplySoup(); }
具体产品类:
public class Beef extends MainCourse{ @Override void printName() { System.out.println("beef"); } }
public class Wine extends Drink{ @Override void printFlavor() { System.out.println("wine"); } }
public class VegetableSoup extends Soup{ @Override void printContent() { System.out.println("vegetable soup"); } }
public class PoachedFish extends MainCourse{ @Override void printName() { System.out.println("poached fish"); } }
public class Orange extends Drink{ @Override void printFlavor() { System.out.println("orange"); } }
public class SilkieSoup extends Soup{ @Override void printContent() { System.out.println("silkie soup"); } }
具体工厂:
public class FrenchRestaurant extends AbstractFactory{ @Override MainCourse supplyFood() { return new Beef(); } @Override Drink supplyDrink() { return new Wine(); } @Override Soup supplySoup() { return new VegetableSoup(); } }
public class ChineseRestaurant extends AbstractFactory{ @Override MainCourse supplyFood() { return new PoachedFish(); } @Override Drink supplyDrink() { return new Orange(); } @Override Soup supplySoup() { return new SilkieSoup(); } }
抽象工厂方法的具体使用:
public class Test { public static void main(String[] args) { AbstractFactory ff = new FrenchRestaurant(); ff.supplyFood().printName(); ff.supplyDrink().printFlavor(); ff.supplySoup().printContent(); AbstractFactory cf = new ChineseRestaurant(); cf.supplyFood().printName(); cf.supplyDrink().printFlavor(); cf.supplySoup().printContent(); } }