经典设计模式——抽象工厂模式

本小妞迷上赌 提交于 2020-04-23 01:46:01

抽象工厂模式用于创建一系列相关或者相互依赖对象,而无需指定具体的类。和工厂模式一样,它包括以下角色:

  • Factory:抽象的工厂,声明工厂方法,该方法返回一个Product类型的对象
  • ConcreteFactory:工厂的实现,重写了工厂方法,并返回ConcreteProduct实例
  • Product:工厂生产出来的抽象产品
  • ConcreteProduct:具体的产品

考虑如下场景:KFC出售2种套餐,一种经济型包含鸡翅和可乐,另一种高档型,包含鸡腿和咖啡。用于只要指出需要的套餐名字就可以获得相应的食品,这种情况下,工厂模式就不再适用了。因为工厂模式每个子工厂只负责生产相互独立的产品,它不适用于一次创建一个“产品套餐”,而抽象工厂模式正是在此方面进行了改进:

//产品族1:KFC食品
abstract class KFCFood {
    public abstract void show();
}
class Chicken extends KFCFood {
    public void show() {
        System.out.println("鸡腿+1");
    }
}
class Wings extends KFCFood {
    public void show() {
        System.out.println("鸡翅+1");
    }
}

//产品族2:KFC饮料
abstract class KFCDrink {
    public abstract void show();
}
class Cola extends KFCDrink {
    public void show() {
        System.out.println("可乐+1");
    }
}
class Coffee extends KFCDrink {
    public void show() {
        System.out.println("咖啡+1");
    }
}


//抽象工厂,生产套餐
interface IKFCFactory {
    KFCFood createFood();
    KFCDrink createDrink();
}

//经济型套餐,包括鸡翅和可乐
class CheapPackageFactory implements IKFCFactory {
    public KFCFood createFood() {
        return new Wings();
    }
    public KFCDrink createDrink() {
        return new Cola();
    }
}

//高档型套餐,包括鸡腿和咖啡
class DearPackageFactory implements IKFCFactory {
    public KFCFood createFood() {
        return new Chicken();
    }
    public KFCDrink createDrink() {
        return new Coffee();
    }
}

public class Client {
    public static void main(String[] args) {
        //经济型套餐
        IFactory factory = new CheapPackageFactory();
        KFCFood food1 = factory.createFood();
        KFCDrink drink1 = factory.createDrink();
        food1.show();
        drink1.show();
    }
}

抽象工厂模式可用于以下情形:

  • 同一个产品族的产品在一起使用,而且它们之间是相互依赖的,不可分离
  • 只希望提供一组对象而不显示它们的实现过程,只显示它们的接口
  • 系统不依赖于某些具体的产品类
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!