Java设计模式【之】抽象工厂模式【场景:生产咖啡】

1.抽象工厂模式

  • 抽象工厂模式
    创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。
    在工厂方法的基础上,进一步抽象工厂类,将工厂抽象成两层,AbsFactory(抽象工厂) 和具体实现工厂子类。
    调用者根据创建对象类型使用对应的工厂子类。
    这样将单个的简单工厂类变成了工厂簇, 利于代码的维护和扩展

  • 使用场景:工厂存在扩展的可能,且扩展后工厂的生产方式存在差异

2.场景代码实现

2.1.场景

  • 生产咖啡
    存在两个品牌的咖啡,不同地域的厂家,生产顺序相同,生产方式不通

2.2.咖啡抽象


/**
 * 咖啡抽象
 */
abstract class Coffee {

    String name;

    public Coffee(String name) {
        this.name = name;
        //准备材料
        materials();
        //生产
        produce();
    }

    //准备材料
    abstract void materials();

    //生产
    abstract void produce();
}

2.3.咖啡的两种品牌实现

class 星巴克 extends Coffee {

    public 星巴克(String name) {
        super(name);
    }

    @Override
    void materials() {
        System.out.println(name + ":【星巴克-原材料:咖啡豆+糖】");
    }

    @Override
    void produce() {
        System.out.println("生产结果:星巴克咖啡x50g \n");

    }
}

class 雀巢 extends Coffee {
    public 雀巢(String name) {
        super(name);
    }

    @Override
    void materials() {
        System.out.println(name + ":【雀巢-原材料:咖啡豆】");
    }

    @Override
    void produce() {
        System.out.println("生产结果:雀巢咖啡x10g\n");
    }
}

2.4.抽象工厂


/**
 * 咖啡工厂
 */
abstract class AbstractCoffeeFactory {

    abstract Coffee createCoffee(String type);

}

2.5.抽象工厂的不同地域实现

/**
 * 杭州咖啡工厂
 */
class HangZhouCoffeeFactory extends AbstractCoffeeFactory {

    public Coffee createCoffee(String type) {
        Coffee c = null;
        switch (type) {
            case "星巴克":
                c = new 星巴克("杭州特加工");
                break;
            case "雀巢":
                c = new 雀巢("杭州特加工");
                break;
            default:
                System.out.println("杭州特加工:" + type + " :不存在!!!\n");
                break;
        }
        return c;
    }
}

/**
 * 上海咖啡工厂
 */
class ShangHaiCoffeeFactory extends AbstractCoffeeFactory {

    public Coffee createCoffee(String type) {
        Coffee c = null;
        switch (type) {
            case "星巴克":
                c = new 星巴克("上海特色");
                break;
            case "雀巢":
                c = new 雀巢("上海特色");
                break;
            default:
                System.out.println("上海特色:" + type + " :不存在!!!\n");
                break;
        }
        return c;
    }
}

2.6.测试


/**
 * 抽象工厂
 * <p>
 * 创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。
 * 在工厂方法的基础上,进一步抽象工厂类,将工厂抽象成两层,AbsFactory(抽象工厂) 和具体实现工厂子类。
 * 调用者根据创建对象类型使用对应的工厂子类。
 * 这样将单个的简单工厂类变成了工厂簇, 利于代码的维护和扩展
 * <p>
 * 使用场景:工厂存在扩展的可能,且扩展后工厂的生产方式存在差异
 */
public class _Test {

    public static void main(String[] args) {

        /**
         * 上海工厂
         */
        Coffee sh_kf_1 = new ShangHaiCoffeeFactory().createCoffee("星巴克");
        Coffee sh_kf_2 = new ShangHaiCoffeeFactory().createCoffee("雀巢");
        Coffee sh_kf_3 = new ShangHaiCoffeeFactory().createCoffee("牛栏山");

        /**
         * 杭州工厂
         */
        Coffee hz_kf_1 = new HangZhouCoffeeFactory().createCoffee("星巴克");
        Coffee hz_kf_2 = new HangZhouCoffeeFactory().createCoffee("雀巢");
        Coffee hz_kf_3 = new HangZhouCoffeeFactory().createCoffee("牛栏山");

        /**
         * 新增后
         */
        //        Coffee ? = new ???CoffeeFactory().createCoffee("?");
        //        Coffee ? = new ???CoffeeFactory().createCoffee("?");
        //        Coffee ? = new ???CoffeeFactory().createCoffee("?");

    }

}

3.源码下载

《七大设计原则》

《目录:Java设计模式》

《幕》

  • 留白 —<老吉>
  • ~ 今 ~ ❀ ~ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长毛山顶洞人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值