在工厂方法基础上,将工厂的生产方法的返回类型从具体产品抽象为抽象产品,同时扩展工厂的方法,支持任意定制产品族,则工厂方法可以升级为抽象工厂模式,比如一家餐厅可以提供牛排(方法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{@Overridevoid printName() {System.out.println("beef");}}
public class Wine extends Drink{@Overridevoid printFlavor() {System.out.println("wine");}}
public class VegetableSoup extends Soup{@Overridevoid printContent() {System.out.println("vegetable soup");}}
public class PoachedFish extends MainCourse{@Overridevoid printName() {System.out.println("poached fish");}}
public class Orange extends Drink{@Overridevoid printFlavor() {System.out.println("orange");}}
public class SilkieSoup extends Soup{@Overridevoid printContent() {System.out.println("silkie soup");}}
具体工厂:
public class FrenchRestaurant extends AbstractFactory{@OverrideMainCourse supplyFood() {return new Beef();}@OverrideDrink supplyDrink() {return new Wine();}@OverrideSoup supplySoup() {return new VegetableSoup();}}
public class ChineseRestaurant extends AbstractFactory{@OverrideMainCourse supplyFood() {return new PoachedFish();}@OverrideDrink supplyDrink() {return new Orange();}@OverrideSoup 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();}}