首页 > 其他分享 >设计模式 - 简单工厂模式

设计模式 - 简单工厂模式

时间:2024-10-30 17:18:14浏览次数:6  
标签:创建 void 模式 工厂 设计模式 public Pizza

目录

一、基本概念

二、组成部分

三、举例说明

3.1 定义产品接口

 3.2 定义具体产品类

3.3 定义工厂类

3.4 客户端代码

四、优缺点

4.1 优点

4.2 缺点

五、总结

5.1 适用场景

5.2 不适用场景

5.3 替代模式


简单工厂模式(Simple Factory Pattern)虽然不是 GoF 设计模式的一部分,但在实际开发中非常常见。简单工厂模式主要用于创建对象,它提供了一个静态方法来创建对象,而不是使用构造函数或工厂方法。简单工厂模式的主要目的是隐藏对象创建的细节,使客户端代码不必关心具体的创建逻辑。

一、基本概念

简单工厂模式的核心思想是定义一个工厂类,这个工厂类负责创建各种不同的产品对象。客户端通过调用工厂类的一个静态方法来获取所需的产品对象,而不需要知道产品的具体创建细节。

二、组成部分

  1. 工厂类(Factory):负责创建产品对象。
  2. 产品接口或抽象类(Product):定义了产品对象应该实现的方法。
  3. 具体产品类(Concrete Products):实现了产品接口或继承自抽象类,代表具体的对象。

三、举例说明

假设我们需要创建不同类型的披萨(Pizza),并且我们希望有一个工厂类来负责创建这些披萨。

3.1 定义产品接口

public interface Pizza {
    void prepare();
    void bake();
    void cut();
    void box();
}

 3.2 定义具体产品类

public class CheesePizza implements Pizza {
    @Override
    public void prepare() {
        System.out.println("Preparing Cheese Pizza");
    }

    @Override
    public void bake() {
        System.out.println("Baking Cheese Pizza");
    }

    @Override
    public void cut() {
        System.out.println("Cutting Cheese Pizza");
    }

    @Override
    public void box() {
        System.out.println("Boxing Cheese Pizza");
    }
}

public class PepperoniPizza implements Pizza {
    @Override
    public void prepare() {
        System.out.println("Preparing Pepperoni Pizza");
    }

    @Override
    public void bake() {
        System.out.println("Baking Pepperoni Pizza");
    }

    @Override
    public void cut() {
        System.out.println("Cutting Pepperoni Pizza");
    }

    @Override
    public void box() {
        System.out.println("Boxing Pepperoni Pizza");
    }
}

3.3 定义工厂类

public class SimplePizzaFactory {
    public Pizza createPizza(String type) {
        Pizza pizza = null;
        switch (type.toLowerCase()) {
            case "cheese":
                pizza = new CheesePizza();
                break;
            case "pepperoni":
                pizza = new PepperoniPizza();
                break;
            default:
                throw new IllegalArgumentException("Unknown pizza type: " + type);
        }
        return pizza;
    }
}

3.4 客户端代码

public class Client {
    public static void main(String[] args) {
        SimplePizzaFactory factory = new SimplePizzaFactory();
        Pizza cheesePizza = factory.createPizza("cheese");
        cheesePizza.prepare();
        cheesePizza.bake();
        cheesePizza.cut();
        cheesePizza.box();

        Pizza pepperoniPizza = factory.createPizza("pepperoni");
        pepperoniPizza.prepare();
        pepperoniPizza.bake();
        pepperoniPizza.cut();
        pepperoniPizza.box();
    }
}

 

四、优缺点

4.1 优点

  1. 封装性好:客户端不需要关心产品的创建细节,只需要知道如何使用产品。
  2. 易于扩展:当需要增加新的产品时,只需要修改工厂类,而不需要修改客户端代码。
  3. 符合开闭原则:对扩展开放,对修改关闭。

4.2 缺点

  1. 违反开闭原则:当需要增加新产品时,工厂类的代码需要修改。
  2. 类的静态方法不易扩展:如果工厂类变得庞大,难以维护。
  3. 单个工厂类包含太多逻辑:可能导致工厂类过于复杂。

五、总结

简单工厂模式通过将对象的创建逻辑封装在一个静态工厂方法中,简化了客户端代码。然而,随着产品的增加,工厂类可能会变得庞大,难以管理和维护。此外,当需要添加新的产品时,需要修改工厂类,这违反了开闭原则。

在实际应用中,可以根据项目的具体需求选择是否使用简单工厂模式。如果产品的类型相对固定,并且未来扩展的可能性较小,那么简单工厂模式是一个不错的选择。如果产品类型可能会频繁变动,那么可以考虑使用其他的创建型模式,如工厂方法模式或抽象工厂模式。

5.1 适用场景

  1. 产品种类有限

    如果产品种类相对较少且稳定,未来扩展的可能性不大,那么可以使用简单工厂模式。这样可以避免工厂类变得过于庞大。
  2. 静态方法适合场景

    如果创建的产品对象不需要复杂的创建逻辑,并且创建过程可以很好地封装在一个静态方法中,那么简单工厂模式是一个合适的选择。
  3. 减少客户端代码复杂性

    如果客户端代码需要频繁地创建产品对象,并且这些对象的创建过程需要一定的逻辑处理,那么简单工厂模式可以帮助隐藏这些逻辑,简化客户端代码。
  4. 中央控制点

    如果希望有一个中央控制点来统一管理所有产品的创建,那么简单工厂模式可以提供这样的功能。

5.2 不适用场景

  1. 产品种类经常变动

    如果产品种类在未来可能会频繁增加或删除,那么使用简单工厂模式会导致工厂类频繁修改,不利于维护。此时更适合使用工厂方法模式或抽象工厂模式。
  2. 工厂类过于庞大

    如果工厂类已经包含了大量的产品创建逻辑,那么继续在同一个类中增加更多的产品可能会导致类过于复杂,难以理解和维护。此时应该考虑重构工厂类或使用其他模式。
  3. 需要支持子类扩展

    如果希望子类能够扩展或覆盖产品的创建逻辑,那么简单工厂模式可能不是一个好的选择,因为它的静态方法不容易被继承或覆盖。这时可以考虑使用工厂方法模式。

5.3 替代模式

  1. 工厂方法模式

    如果需要支持子类扩展产品的创建逻辑,或者产品种类可能会增加,那么工厂方法模式是一个更好的选择。它允许子类通过继承来扩展产品的创建逻辑。
  2. 抽象工厂模式

    如果需要创建一系列相关的产品族,并且这些产品族之间存在依赖关系,那么抽象工厂模式更为合适。它可以创建一组相关的产品对象,而不需要指定它们的具体类。
  3. 建造者模式

    如果产品的创建过程非常复杂,涉及到多个步骤,并且这些步骤可能会发生变化,那么建造者模式可以更好地应对这种情况。

标签:创建,void,模式,工厂,设计模式,public,Pizza
From: https://blog.csdn.net/YuanFudao/article/details/143369902

相关文章

  • 【笔记】【Android】Activity的Task模式
    【笔记】【Android】Activity的Task模式笔记系列,内容是从网络搜索的结果,不一定是正确的理解。如果存在谬误,欢迎大家指正。Task一个应用可能会包含多个Activity,管理这些Activity顺序的容器,就是Task。当Activity1拉起Activity2时,Task会将Activity2压栈,将显示Activity2的内容。......
  • 06.动态代理设计模式
    06.动态代理设计模式目录介绍01.为何要动态代理1.1为何要动态代理1.2动态代理思考02.动态代理的概念2.1动态代理定义2.2动态代理类比理解2.3动态代理参与者2.4动态代理步骤03.动态代理的实现3.1罗列一个场景3.2用一个例子理解代理3.3基于接口动态代......
  • 二、DEBUG模式及常用指令
    debug概述debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用他可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行debug的功能调试(Debug)的命令比较多,共有20多个,但这6个命令是和汇编学习密切相关的。在以后的实验中,我们还会用到一个P命令。......
  • 基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据
    时间序列数据表示了一个随时间记录的值的序列。理解这些序列内部的关系,尤其是在多元或复杂的时间序列数据中,不仅仅局限于随时间绘制数据点(这并不是说这种做法不好)。通过将时间序列数据转换为图,我们可以揭示数据片段内部隐藏的连接、模式和关系,帮助我们发现平稳性和时间连通......
  • Java设计模式-单例模式和工厂模式的思路解析
    前言什么是设计模式?是广大程序员们总结汇总的一些编码套路,通常被用于底层内容的编写单例模式一个类只能被实例化一个对象饿汉式忽略需求,直接创建唯一实例/***单例模式-饿汉式*/publicclassClassA{//用来返回的唯一实例//static:1.保证getClassA......
  • 实验6:原型模式(向量的原型)
    [实验任务一]:向量的原型用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。 1.类图   2. 源代码(1) 浅克隆代码和运行结果#include<bits/stdc++.h>usingnamespacestd;classVector......
  • 实验7:单例模式(学号的单一 )
    [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。1. 类图 1. 源代码//StudentID.javapackagetest7; publicclassStudentID{    privatestaticStudentIDinstance=null;    privateStringid;     privat......
  • 策略设计模式
    设计模式-策略设计模式策略设计模式(StrategyPattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。这种模式让算法独立于使用它的客户端。简而言之,策略模式允许在运行时更改算法的行为。策略模式的组成部分:Context(上下文):上下文指的是......
  • 在 ASP.NET Core 中使用 EF Core 进行开启事务工作单元(Unit of Work) 仓储层,服务层模式
    在ASP.NETCore中使用EntityFrameworkCore实现一个带有事务的工作单元(UnitofWork)模式的仓储层和服务层,可以确保在执行多个数据库操作时具有原子性。这样,即使某个操作出现错误,所有操作也可以回滚。以下是如何实现这个模式的详细步骤:定义实体类我们首先定义一个简单的实......
  • C#05-设计模式学习笔记
    @目录1.设计模式的七大原则1.单一职责原则2.迪米特法则3.里氏代换原则4.依赖倒置原则5.接口隔离原则6.开闭原则7.合成复用原则8.总结2.创建型模式1.单例模式2.工厂方法模式1.简单工厂模式2.工厂模式3.抽象工厂模式4.生成器模式5.原型模式3.结构型设计模式1.适配器模式行为型设计模......