【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(一)

简介: 【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(一)

一、使用传统方法

类图

image.png


步骤概括

步骤一:创建一个Pizza抽象类

public abstract class Pizza {
    public String name;
    public abstract void prepare();
    public void bake() {
        System.out.println(name + " baking");
    }
    public void cut() {
        System.out.println(name + " cutting");
    }
    public void box() {
        System.out.println(name + " boxing");
    }
    public void setName(String name) {
        this.name = name;
    }
}



分析: 这个类用来代表制作披萨的整个流程:准备阶段prepare()、烘烤阶段bake()、切割阶段cut()和打包阶段box() ,假设各个披萨的准备阶段需要的材料不一样,所以把准备阶段定义为一个抽象方法 ,其它三个阶段都一样。


步骤二:创建两个披萨类

public class CheesePizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("奶酪披萨正在准备中");
    }
}


分析: 这个类代表奶酪披萨,简单重写一下准备阶段


public class BeefPizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("牛肉披萨正在准备中");
    }
}


分析: 这个类代表牛肉披萨,也简单重写一下准备阶段


步骤三:制定订购披萨类

public class OrderPizza {
    public OrderPizza() {
        Pizza pizza = null;
        do {
            String pizzaType = getType();
            if ("cheese".equalsIgnoreCase(pizzaType)) {
                 pizza = new CheesePizza();
                 pizza.setName("cheese");
            } else if ("beef".equalsIgnoreCase(pizzaType)) {
                pizza = new BeefPizza();
                pizza.setName("beef");
            } else {
                break;
            }
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        } while (true);
    }
    // 写一个方法,可以获取希望订购的披萨种类
    private String getType() {
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza 种类:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}



分析: 慢慢看代码,可以明白,订购披萨的逻辑代码写在了该类的构造器中,getType()方法是用来获取希望订购的披萨种类。但是,如果我们需要添加新的披萨,就需要从这个类中继续添加相应的逻辑语句,从而修改了订购披萨的这个类,就违反了OCP原则


步骤四:创建运行类

public class PizzaStore {
    public static void main(String[] args) {
       new OrderPizza();
    }
}


运行结果:


image.png

优缺点分析

优点:比较好理解,简单易操作

缺点:违反了设计模式的ocp原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码


相关文章
|
2天前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
2天前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
2天前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
2天前
|
设计模式 缓存 算法
Java设计模式-访问者模式(22)
Java设计模式-访问者模式(22)
|
2天前
|
设计模式 Java
Java设计模式-中介者模式(20)
Java设计模式-中介者模式(20)
|
3月前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
48 4
|
5天前
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
22 11
|
1月前
|
设计模式 存储 负载均衡
【五】设计模式~~~创建型模式~~~单例模式(Java)
文章详细介绍了单例模式(Singleton Pattern),这是一种确保一个类只有一个实例,并提供全局访问点的设计模式。文中通过Windows任务管理器的例子阐述了单例模式的动机,解释了如何通过私有构造函数、静态私有成员变量和公有静态方法实现单例模式。接着,通过负载均衡器的案例展示了单例模式的应用,并讨论了单例模式的优点、缺点以及适用场景。最后,文章还探讨了饿汉式和懒汉式单例的实现方式及其比较。
【五】设计模式~~~创建型模式~~~单例模式(Java)
|
2天前
|
设计模式 Java 安全
Java设计模式-单例模式(2)
Java设计模式-单例模式(2)
|
4月前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式