工厂方法模式

工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品

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;
    }
}

/** 披萨(抽象产品) */
abstract class AbstractPizza {

    /** 准备原材料 */
    public abstract void prepare();

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

/** 北京奶酪披萨(具体产品) */
class BjCheesePizza extends AbstractPizza {

    @Override
    public void prepare() {
        System.out.println("北京奶酪披萨准备原材料");
    }

    @Override
    public void box() {
        System.out.println("北京奶酪披萨准备打包");
    }
}

/** 北京胡椒披萨(具体产品)*/
class BjPepperPizza extends AbstractPizza {

    @Override
    public void prepare() {
        System.out.println("北京胡椒披萨准备原材料");
    }

    @Override
    public void box() {
        System.out.println("北京胡椒披萨准备打包");
    }
}

/** 伦敦奶酪披萨(具体产品) */
class LdCheesePizza extends AbstractPizza {

    @Override
    public void prepare() {
        System.out.println("伦敦奶酪披萨准备原材料");
    }

    @Override
    public void box() {
        System.out.println("伦敦奶酪披萨准备打包");
    }
}

/** 伦敦胡椒披萨(具体产品)*/
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;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、定义 工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化...
    其勇勇阅读 8,657评论 3 3
  • 工厂方法模式 案例 我们有一个生产镜子工厂,工厂里可以生产圆形和方形镜子,顾客通过选择来使用不同的镜子。我们怎么通...
    Phoegel阅读 296评论 0 0
  • 工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,...
    李建彪阅读 199评论 0 1
  • 工厂方法模式 工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中...
    感觉身体被掏空_23ae阅读 103评论 0 0
  • UML类图 模式定义 工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神...
    虎三呀阅读 182评论 0 0