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

2019-07-31  本文已影响0人  prik丶

《Head First 设计模式》 学习笔记,码云同步更新中

如有错误或不足之处,请一定指出,谢谢~

目录

查看其它设计模式笔记,点这里→设计模式笔记汇总

抽象工厂模式(Abstract Factory Pattern)

/**
 * 披萨原料抽象工厂
 **/
public interface PizzaIngredientFactory {

    Cheese createCheese();

    Pepperoni createPepperoni();
}

/**
 * 意大利香肠原料
 **/
public interface Pepperoni {
    // 略...
}

/**
 * 芝士原料
 **/
public interface Cheese {
    // 略...
}

/**
 * 上海用的芝士
 **/
public class SHCheese implements Cheese {
    // 略...
}

/**
 * 上海用的香肠
 **/
public class SHPepperoni implements Pepperoni {
    // 略...
}


/**
 * 披萨 抽象
 **/
public abstract class Pizza {

    String name;

    public Cheese cheese;

    public Pepperoni pepperoni;

    /**
     * 准备
     * 申明为抽象方法,子类需自行实现原料准备
     */
    public abstract void prepare();

    /**
     * 烘焙
     */
    public void bake() {
        System.out.println("烘焙中...");
    }

    /**
     * 切片
     */
    public void cut() {
        System.out.println("切片中...");
    }

    /**
     * 装盒
     */
    public void box() {
        System.out.println("装盒中...");
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/**
 * 芝士披萨
 **/
public class CheesePizza extends Pizza {

    PizzaIngredientFactory ingredientFactory;

    /**
     * 构造器注入工厂
     *
     * @param ingredientFactory
     */
    public CheesePizza(PizzaIngredientFactory ingredientFactory) {
        this.ingredientFactory = ingredientFactory;
    }

    /**
     * pizza无需关心到底是什么类型的原料工厂,只要是原料工厂就行
     */
    @Override
    public void prepare() {
        System.out.println("原料准备中");
        // 为基类属性赋值
        cheese = ingredientFactory.createCheese();
        pepperoni = ingredientFactory.createPepperoni();
    }
}

/**
 * 披萨店 抽象
 **/
public abstract class PizzaStore {

    public Pizza orderPizza(String type) {

        // 把创建披萨方法从简单工厂拿回来
        Pizza pizza = createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        System.out.println(pizza.getName() + "制作完成");

        return pizza;
    }

    /**
     * 将实例化披萨的责任移到抽象方法中,这个方法就等同于一个工厂
     * 子类通过这个方法来执行对象实例化逻辑,达到超类和子类解耦的目的
     */
    abstract Pizza createPizza(String type);
}

/**
 * 上海加盟店
 **/
public class SHPizzaStore extends PizzaStore {

    /**
     * 上海披萨原料工厂
     */
    private PizzaIngredientFactory ingredientFactory = new SHPizzaIngredientFactory();

    private Pizza pizza;

    @Override
    protected Pizza createPizza(String type) {
        if ("cheese".equals(type)) {
            pizza = new CheesePizza(ingredientFactory);
            pizza.setName("上海芝士披萨");
            return pizza;
        } else if ("veggie".equals(type)) {
            // 略...
            return null;
        }
        return null;
    }
}

/**
 * 测试类
 **/
public class Test {
    public static void main(String[] args) {
        SHPizzaStore shPizzaStore = new SHPizzaStore();
        shPizzaStore.orderPizza("cheese");
    }
}

结果:
    原料准备中
        原料:上海芝士
        原料:上海腊肠
    烘焙中...
    切片中...
    装盒中...
    上海芝士披萨制作完成
上一篇 下一篇

猜你喜欢

热点阅读