设计模式 - 抽象工厂模式

定义

和工厂方法 类似;只是 每一个具体的工厂可以 创建多种“产品”

优缺点

优点

  • 对调用者更友好:调用者无需了解"产品"的创建细节,直接调用工厂创建即可;
  • 如果随着业务修改,新增"产品",无需修改原工厂,只需要新增具体工厂类即可;符合“开闭原则”

缺点

  • 如果工厂中新增一个"产品"组成,修改修改 此抽象工厂的 所有具体实现

适用场景

  • 调用者不关心 “产品” 具体的创建细节;只想要 由多种"产品"组成的结果

主要组成结构

  • 抽象工厂:生产 “产品” 的 共性抽象
  • 具体工厂:包含具体的 生产 “产品” 的工厂实现
  • 抽象产品:"产品"种类的共性抽象,产品类型定义
  • 具体产品:具体的产品实现

类图

抽象工厂模式.jpg

代码实现

public class AbstractFactoryPattern {

    public static void main(String[] args) {
        final SetMeal chicken1SetFactory = new Chicken1SetFactory();
        chicken1SetFactory.create();
        System.out.println(chicken1SetFactory);
        final SetMeal chicken2SetFactory = new Chicken2SetFactory();
        chicken2SetFactory.create();
        System.out.println(chicken2SetFactory);
    }

}

/**
 * 案例:肯德基 鸡肉套餐:中可+鸡肉汉堡+鸡米花(大)
 */
interface Drink {
    /**
     * 生产饮料
     *
     * @return 饮料
     */
    Drink create();
}

class Coffee implements Drink{

    /**
     * 生产饮料
     *
     * @return 饮料
     */
    @Override
    public Drink create() {
        System.out.println("咖啡");
        return new Coffee();
    }
}
class Coke implements Drink{

    /**
     * 生产饮料
     *
     * @return 饮料
     */
    @Override
    public Coke create() {
        System.out.println("可乐");
        return new Coke();
    }
}

interface StapleFood {
    /**
     * 生产主食
     *
     * @return 主食
     */
    StapleFood create();
}

class Hamburger implements StapleFood{

    /**
     * 生产主食
     *
     * @return 主食
     */
    @Override
    public StapleFood create() {
        System.out.println("汉堡");
        return new Hamburger();
    }
}

class ChickenRolls implements StapleFood{

    /**
     * 生产主食
     *
     * @return 主食
     */
    @Override
    public StapleFood create() {
        System.out.println("鸡肉卷");
        return new ChickenRolls();
    }
}

interface Snack {
    /**
     * 生产小吃
     *
     * @return 小吃
     */
    Snack create();
}

class ChickenNuggets implements Snack{

    /**
     * 生产小吃
     *
     * @return 小吃
     */
    @Override
    public Snack create() {
        System.out.println("鸡块");
        return new ChickenNuggets();
    }
}
class PopcornChicken implements Snack{

    /**
     * 生产小吃
     *
     * @return 小吃
     */
    @Override
    public Snack create() {
        System.out.println("鸡米花");
        return new PopcornChicken();
    }
}

    /**
     * 套餐 抽象工厂
     */

interface SetMeal {

    void create();
}

class Chicken1SetFactory implements SetMeal{
    Drink drink;

    StapleFood stapleFood;
    Snack snack;


    @Override
    public void create() {
        final Coke coke = new Coke();
        final Hamburger hamburger = new Hamburger();
        final PopcornChicken popcornChicken = new PopcornChicken();
        snack = popcornChicken.create();
        stapleFood = hamburger.create();
        drink = coke.create();
    }

    @Override
    public String toString() {
        return "Chicken1SetFactory{" +
                "drink=" + drink +
                ", stapleFood=" + stapleFood +
                ", snack=" + snack +
                '}';
    }
}

class Chicken2SetFactory implements SetMeal{
    Drink drink;
    StapleFood stapleFood;
    Snack snack;


    @Override
    public void create() {
        final Drink coke = new Coke();
        final StapleFood chickenRolls = new ChickenRolls();
        final Snack popcornChicken = new PopcornChicken();
        snack = popcornChicken.create();
        stapleFood = chickenRolls.create();
        drink = coke.create();
    }

    @Override
    public String toString() {
        return "Chicken2SetFactory{" +
                "drink=" + drink +
                ", stapleFood=" + stapleFood +
                ", snack=" + snack +
                '}';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值