工廠方法模式

工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計模式,此模式的核心精神是封裝類中變化的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、復(fù)用和方便后期維護拓展的目的。它的核心結(jié)構(gòu)有四個角色,分別是抽象工廠;具體工廠;抽象產(chǎn)品;具體產(chǎn)品

package com.strife.pattern.factory;

/**
 * 工廠方法模式
 *
 * @author mengzhenghao
 * @date 2022/5/28
 */
public class FactoryMethod {

    public static void main(String[] args) throws Exception {
        new BjPizzaFactory("cheese");
        new BjPizzaFactory("pepper");
        new LdPizzaFactory("cheese");
        new LdPizzaFactory("cheese");
    }
}

/** 訂購披薩 (抽象工廠)*/
abstract class AbstractPizzaFactory {

    public AbstractPizzaFactory(String pizzaType) throws Exception {
        AbstractPizza pizza = makePizza(pizzaType);
        if (pizza != null) {
            pizza.prepare();
            pizza.box();
        } else {
            System.out.println("暫無該品種");
        }

    }

    /** 制作披薩 */
    public abstract AbstractPizza makePizza(String pizzaType) throws Exception;
}

/** 北京披薩工廠(具體工廠) */
class BjPizzaFactory extends AbstractPizzaFactory {

    public BjPizzaFactory(String pizzaType) throws Exception {
        super(pizzaType);
    }

    @Override
    public AbstractPizza makePizza(String pizzaType) throws Exception {
        for (BjPizzaTypeEnum pizzaTypeEnum : BjPizzaTypeEnum.values()) {
            if (pizzaType.equals(pizzaTypeEnum.getPizzaType())) {
                return (AbstractPizza) Class.forName(pizzaTypeEnum.getClazz()).newInstance();
            }
        }
        return null;
    }
}

/** 倫敦披薩工廠(具體工廠) */
class LdPizzaFactory extends AbstractPizzaFactory {

    public LdPizzaFactory(String pizzaType) throws Exception {
        super(pizzaType);
    }

    @Override
    public AbstractPizza makePizza(String pizzaType) throws Exception {
        for (LdPizzaTypeEnum pizzaTypeEnum : LdPizzaTypeEnum.values()) {
            if (pizzaType.equals(pizzaTypeEnum.getPizzaType())) {
                return (AbstractPizza) Class.forName(pizzaTypeEnum.getClazz()).newInstance();
            }
        }
        return null;
    }
}

/** 披薩(抽象產(chǎn)品) */
abstract class AbstractPizza {

    /** 準備原材料 */
    public abstract void prepare();

    /** 打包 */
    public abstract void box();
}

/** 北京奶酪披薩(具體產(chǎn)品) */
class BjCheesePizza extends AbstractPizza {

    @Override
    public void prepare() {
        System.out.println("北京奶酪披薩準備原材料");
    }

    @Override
    public void box() {
        System.out.println("北京奶酪披薩準備打包");
    }
}

/** 北京胡椒披薩(具體產(chǎn)品)*/
class BjPepperPizza extends AbstractPizza {

    @Override
    public void prepare() {
        System.out.println("北京胡椒披薩準備原材料");
    }

    @Override
    public void box() {
        System.out.println("北京胡椒披薩準備打包");
    }
}

/** 倫敦奶酪披薩(具體產(chǎn)品) */
class LdCheesePizza extends AbstractPizza {

    @Override
    public void prepare() {
        System.out.println("倫敦奶酪披薩準備原材料");
    }

    @Override
    public void box() {
        System.out.println("倫敦奶酪披薩準備打包");
    }
}

/** 倫敦胡椒披薩(具體產(chǎn)品)*/
class LdPepperPizza extends AbstractPizza {

    @Override
    public void prepare() {
        System.out.println("倫敦胡椒披薩準備原材料");
    }

    @Override
    public void box() {
        System.out.println("倫敦胡椒披薩準備打包");
    }
}


enum BjPizzaTypeEnum {
    /** 北京奶酪披薩*/
    CHEESE("cheese", "com.strife.pattern.factory.BjCheesePizza"),

    /** 北京胡椒披薩*/
    PEPPER("pepper", "com.strife.pattern.factory.BjPepperPizza");


    private final String pizzaType;
    private final String clazz;

    BjPizzaTypeEnum(String pizzaType, String clazz) {
        this.pizzaType = pizzaType;
        this.clazz = clazz;
    }

    public String getPizzaType() {
        return pizzaType;
    }

    public String getClazz() {
        return clazz;
    }
}

enum LdPizzaTypeEnum {

    /** 倫敦奶酪披薩*/
    CHEESE("cheese", "com.strife.pattern.factory.LdCheesePizza"),

    /** 倫敦胡椒披薩*/
    PEPPER("pepper", "com.strife.pattern.factory.LdPepperPizza");


    private final String pizzaType;
    private final String clazz;

    LdPizzaTypeEnum(String pizzaType, String clazz) {
        this.pizzaType = pizzaType;
        this.clazz = clazz;
    }

    public String getPizzaType() {
        return pizzaType;
    }

    public String getClazz() {
        return clazz;
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、定義 工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計模式,此模式的核心精神是封裝類中變化...
    其勇勇閱讀 8,833評論 3 3
  • 工廠方法模式 案例 我們有一個生產(chǎn)鏡子工廠,工廠里可以生產(chǎn)圓形和方形鏡子,顧客通過選擇來使用不同的鏡子。我們怎么通...
    Phoegel閱讀 346評論 0 0
  • 工廠方法模式(FACTORY METHOD)是一種常用的對象創(chuàng)建型設(shè)計模式,此模式的核心精神是封裝類中不變的部分,...
    李建彪閱讀 220評論 0 1
  • 工廠方法模式 工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計模式,此模式的核心精神是封裝類中...
    感覺身體被掏空_23ae閱讀 107評論 0 0
  • UML類圖 模式定義 工廠方法模式(FACTORY METHOD)是一種常用的對象創(chuàng)建型設(shè)計模式,此模式的核心精神...
    虎三呀閱讀 205評論 0 0

友情鏈接更多精彩內(nèi)容