”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java 中的设计模式及其示例

Java 中的设计模式及其示例

发布于2024-11-09
浏览:548

Design Patterns in Java with examples

Java 中的设计模式是什么?

设计模式是软件设计中常见问题的可重用解决方案。它们代表了可应用于软件开发中各种情况的最佳实践,特别是像 Java 这样的面向对象编程。

设计模式的类型

  • 创建模式: 处理对象创建机制。
  • 结构模式: 关注类和对象的组成方式。
  • 行为模式: 关注对象之间的通信。

设计模式的用途

  • 提高代码的可重用性。
  • 提高代码可读性和可维护性。
  • 促进开发者之间的沟通。

设计模式示例

1. 单例模式

    public class Singleton {
        private static Singleton instance;

        private Singleton() {}

        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
优点:
  • 对单个实例的受控访问。
  • 通过防止多个实例来节省内存。
缺点:
  • 由于全局状态而难以测试。
  • 可能导致紧密耦合。

2. 观察者模式

    import java.util.ArrayList;
    import java.util.List;

    interface Observer {
        void update(String message);
    }

    class Subject {
        private List observers = new ArrayList();

        public void addObserver(Observer observer) {
            observers.add(observer);
        }

        public void notifyObservers(String message) {
            for (Observer observer : observers) {
                observer.update(message);
            }
        }
    }
优点:
  • 促进主体和观察者之间的松耦合。
  • 可轻松扩展新观察者。
缺点:
  • 如果有很多观察者,性能会很差。
  • 由于间接通信而难以调试。

3. 建造者模式

    class Product {
        private String part1;
        private String part2;

        public void setPart1(String part1) { this.part1 = part1; }
        public void setPart2(String part2) { this.part2 = part2; }
    }

    class Builder {
        private Product product = new Product();

        public Builder buildPart1(String part1) {
            product.setPart1(part1);
            return this;
        }

        public Builder buildPart2(String part2) {
            product.setPart2(part2);
            return this;
        }

        public Product build() {
            return product;
        }
    }
优点:
  • 简化复杂对象的创建。
  • 使代码更具可读性和可维护性。
缺点:
  • 通过多个构建器类增加复杂性。
  • 对于简单的对象来说可能有点过分了。

4.工厂模式

    interface Shape {
       void draw();
    }

    class Circle implements Shape {
       public void draw() { System.out.println("Drawing a Circle"); }
    }

    class Rectangle implements Shape {
       public void draw() { System.out.println("Drawing a Rectangle"); }
    }

    class ShapeFactory {
       public Shape getShape(String shapeType) {
          if (shapeType == null) return null;
          if (shapeType.equalsIgnoreCase("CIRCLE")) return new Circle();
          if (shapeType.equalsIgnoreCase("RECTANGLE")) return new Rectangle();
          return null;
       }
    }
优点:
  • 封装对象创建逻辑。
  • 无需修改现有代码即可轻松扩展新形状。
缺点:
  • 添加额外的类,这会增加复杂性。
  • 如果使用不当,可能会导致工厂类激增。

四人帮 (GoF)

“四人帮”指的是有影响力的书《设计模式:可重用面向对象软件的元素》的作者。作者——Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides——介绍了 23 种经典设计模式,这些模式已成为软件工程的基础。

结论

设计模式是 Java 编程中的重要工具,可帮助开发人员创建健壮且可维护的系统。了解它们的用途、优点和缺点对于有效的软件设计至关重要。四人帮的贡献为有效应用这些模式提供了坚实的基础。

版本声明 本文转载于:https://dev.to/codegreen/design-patterns-in-java-with-examples-1klg?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 以下是一些标题选项,请记住问题格式:

简单直接:

* 如何用JavaScript动态调整输入字段宽度?
* 创建响应式输入字段:JavaScript So
    以下是一些标题选项,请记住问题格式: 简单直接: * 如何用JavaScript动态调整输入字段宽度? * 创建响应式输入字段:JavaScript So
    动态调整输入字段的宽度以适应其输入动态调整输入字段的宽度以匹配其内容长度可以增强用户体验防止布局混乱。虽然设置固定宽度可能会导致多余的空间或截断文本,但动态方法可确保输入字段具有视觉吸引力和功能性。不幸的是,使用 CSS 的 min-width 属性设置最小宽度不适用于输入字段。然而,现代浏览器提供...
    编程 发布于2024-11-09
  • 如何使用 JavaScript 从 iFrame 重定向父窗口?
    如何使用 JavaScript 从 iFrame 重定向父窗口?
    从 iFrame 重定向父窗口如果父窗口中嵌入了 iFrame,则可能需要重定向父窗口窗口的位置更改为新的 URL。为了实现这一点,JavaScript 提供了一个简单的解决方案。使用 JavaScript 重定向父窗口在 iFrame 的 JavaScript 代码中,您可以使用以下方法: 重定向...
    编程 发布于2024-11-09
  • 如何使用 Curl 模拟 Web 浏览器的 GET 请求?
    如何使用 Curl 模拟 Web 浏览器的 GET 请求?
    使用 Curl 模拟 Web 浏览器的 GET 请求尝试使用curl 检索网页时,您可能会遇到似乎源于以下原因的错误无法识别或未实现的请求标头。这是因为curl本身并不模拟Web浏览器的GET请求标头。要正确模拟Web浏览器,请按照下列步骤操作:配置用户代理:使用CURLOPT_USERAGENT为...
    编程 发布于2024-11-09
  • 通过“从参数中提取信息”项目释放您的 Python 能力
    通过“从参数中提取信息”项目释放您的 Python 能力
    您准备好将您的 Python 技能提升到新的水平了吗? LabEx 提供的“从参数中提取信息”项目就是您的最佳选择。这个引人入胜的项目将指导您完成从给定文本中提取数字、计算平均值并将结果格式化为小数点后两位的过程。潜入并释放你作为 Python 程序员的真正潜力! 踏上激动人心的旅程...
    编程 发布于2024-11-09
  • HTML 表单中的默认提交按钮行为是什么?
    HTML 表单中的默认提交按钮行为是什么?
    确定 HTML 表单中的默认提交按钮在未单击特定提交按钮的情况下提交 HTML 表单时,例如按 输入或在 JavaScript 中使用 HTMLFormElement.submit(),浏览器需要确定多个提交按钮(如果有)中的哪一个应被视为按下的按钮。此确定对于触发 onclick 事件处理程序和发...
    编程 发布于2024-11-09
  • 如何在Python中实现异步Shell命令执行:探索最佳实践
    如何在Python中实现异步Shell命令执行:探索最佳实践
    Python 中的异步 Shell 命令执行:探索替代方法从 Python 脚本异步运行外部命令是一项有价值的技术,允许持续执行脚本当外部命令执行其任务时。本文探讨了实现这种异步行为的适当方法,重点关注 os.system() 和 subprocess.Popen.os.system() 和 & 符...
    编程 发布于2024-11-09
  • 状态测试用例中的 ReactDOM.unstable_batchedUpdates。
    状态测试用例中的 ReactDOM.unstable_batchedUpdates。
    在本文中,我们将研究 ReactDOM.unstable_batchedUpdates 在测试用例中的使用,特别是在 Zustand(React 的流行状态管理库)中。我们还将分解测试并解释批量更新如何通过最小化不必要的重新渲染来增强 React 的性能。 理解测试用例 这是我们将要...
    编程 发布于2024-11-09
  • 如何使用 jQuery 和 CSS 创建响应式水平页面滑动系统?
    如何使用 jQuery 和 CSS 创建响应式水平页面滑动系统?
    响应式水平页面滑动问题设计响应式水平导航系统面临几个挑战:维护页面视口内的可见性防止页面之间出现间隙或重叠允许页面超出 100% 高度,并具有滚动条可见性确保与 Internet Explorer 9 或更高版本的兼容性解决方案此解决方案采用 jQuery 并包含以下主要功能:响应式大小调整: 脚本...
    编程 发布于2024-11-09
  • 为什么编译器中的“static_assert”与非类型模板参数的行为不同?
    为什么编译器中的“static_assert”与非类型模板参数的行为不同?
    编译器中非类型模板参数的 static_assert 行为不一致在 C 中, static_assert 可用于在编译时验证条件。然而,最近的观察发现,当 static_assert 与不同编译器中的非类型模板参数结合使用时,其行为存在差异。具体来说,以下代码片段:template <int ...
    编程 发布于2024-11-09
  • 何时以及如何在 JavaScript 的 parseInt() 函数中使用 Radix?
    何时以及如何在 JavaScript 的 parseInt() 函数中使用 Radix?
    了解 parseInt 中对基数的需求JavaScript 中的 parseInt() 函数允许您将表示数字的字符串转换为整数。但是,您可能并不总是希望将整数解析为以 10 为基数的数字。这就是基数参数发挥作用的地方。什么是基数?基数是指在数字系统中单个数字可以表示的值的数量。例如,我们常用的十进制...
    编程 发布于2024-11-09
  • 尝试重载队列构造函数
    尝试重载队列构造函数
    该项目旨在通过添加两个新的构造函数来改进 Queue 类。 第一个构造函数将从另一个现有队列创建一个新队列。 第二个构造函数将允许您创建具有初始值的队列。 这些构造函数显着提高了 Queue 类的可用性。 1 创建一个名为 QDemo2.java 的文件,并将更新后的 Queue 类从 Try T...
    编程 发布于2024-11-09
  • 实施订单处理系统:零件监控和警报
    实施订单处理系统:零件监控和警报
    1. Introduction and Goals Welcome to the fourth installment of our series on implementing a sophisticated order processing system! In our pre...
    编程 发布于2024-11-09
  • 以客户端为中心的错误处理
    以客户端为中心的错误处理
    了解和处理错误 为了有效地处理错误,必须了解可能发生的错误类型。让我们首先对您可能遇到的错误进行分类。 Web 客户端环境中的错误类型 网络错误 连接问题:与服务器建立连接时出现问题。 超时:请求花费太长时间才能收到响应。 DNS 错误:域名解析问题...
    编程 发布于2024-11-09
  • 如何在Python中高效计算目录大小?
    如何在Python中高效计算目录大小?
    使用 Python 进行目录大小计算为了测量目录的空间占用情况,Python 提供了几种方法。下面我们深入探讨一个高效、全面的解决方案:import os def directory_size(start_path): total_size = 0 for root, directo...
    编程 发布于2024-11-09
  • 如何修复Go模块导入过时的包版本?
    如何修复Go模块导入过时的包版本?
    Go 模块导入过时的包版本尝试使用 Go 模块将新包合并到项目中时,您可能会遇到以下问题:尽管该包被标记为“最新”,但模块系统检索该包的过时版本。这个过时的版本可能缺少代码所需的功能,从而导致编译或运行时错误。解决方案:在 go.mod 文件中指定版本Go 模块系统允许您可以指定要导入的包的确切版本...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3