在工厂方法基础上,将工厂的生产方法的返回类型从具体产品抽象为抽象产品,同时扩展工厂的方法,支持任意定制产品族,则工厂方法可以升级为抽象工厂模式,比如一家餐厅可以提供牛排(方法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();
}
}

本文介绍了如何将工厂方法升级为抽象工厂模式,通过餐厅提供不同类型的主菜、饮料和汤品实例,展示了如何创建一个可扩展的菜品定制系统。

704

被折叠的 条评论
为什么被折叠?



