Java 设计模式一

Java 设计模式是软件开发中的一类解决方案,旨在解决常见的设计问题,提升代码的可维护性、可复用性和扩展性。它们通常基于一些经验和最佳实践,提供了解决问题的标准化方法。以下是常见的 Java 设计模式及其概述:

1. 创建型模式 (Creational Patterns)

这些模式涉及对象的创建,关注如何实例化对象而不是直接使用构造方法。

  • 单例模式 (Singleton Pattern)
    确保类只有一个实例,并提供全局访问点。
    例:Runtime 类是单例模式的一个例子。

    public class Singleton {
        private static Singleton instance;
        
        private Singleton() {}
        
        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
  • 工厂方法模式 (Factory Method Pattern)
    定义一个创建对象的接口,允许子类决定实例化哪一个类。
    例:java.util.Calendar 的子类可以根据系统的不同提供不同的实现。

    public interface Product {
        void use();
    }
    
    public class ConcreteProduct implements Product {
        public void use() {
            System.out.println("Using ConcreteProduct");
        }
    }
    
    public abstract class Creator {
        public abstract Product factoryMethod();
    }
    
    public class ConcreteCreator extends Creator {
        public Product factoryMethod() {
            return new ConcreteProduct();
        }
    }
    
  • 抽象工厂模式 (Abstract Factory Pattern)
    提供一个接口,用于创建一系列相关或依赖对象,而无需指定它们具体的类。
    例:GUI 组件库可以通过抽象工厂来创建不同平台的按钮、文本框等控件。

  • 建造者模式 (Builder Pattern)
    将复杂对象的构建过程与其表示分离,使同样的构建过程可以创建不同的表示。
    例:通过 StringBuilder 来动态构建字符串。

  • 原型模式 (Prototype Pattern)
    通过复制现有的对象来创建新对象,而不是通过构造函数。
    例:Object.clone() 方法是原型模式的一个实现。

2. 结构型模式 (Structural Patterns)

这些模式关注如何通过组合类和对象来获得更大的结构。

  • 适配器模式 (Adapter Pattern)
    将一个类的接口转换为客户希望的另一个接口,使原本接口不兼容的类可以一起工作。
    例:java.io.InputStreamReaderReader 的适配器。

    public interface Target {
        void request();
    }
    
    public class Adaptee {
        public void specificRequest() {
            System.out.println("Specific request");
        }
    }
    
    public class Adapter implements Target {
        private Adaptee adaptee;
        
        public Adapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }
        
        public void request() {
            adaptee.specificRequest();
        }
    }
    
  • 桥接模式 (Bridge Pattern)
    将抽象部分与它的实现部分分离,使得两者可以独立变化。
    例:图形绘制应用中,图形(抽象)和画笔(实现)可以分别变化。

  • 装饰模式 (Decorator Pattern)
    动态地给一个对象添加额外的职责,而不影响其他对象。
    例:Java 的 java.io.BufferedReader 类是对原始 Reader 类的装饰。

  • 外观模式 (Facade Pattern)
    为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。
    例:数据库连接池的 API 提供了一个简单的接口,隐藏了复杂的连接管理过程。

  • 享元模式 (Flyweight Pattern)
    使用共享对象来有效地支持大量细粒度对象的复用。
    例:字符串常量池就是一个享元模式的实现。

  • 代理模式 (Proxy Pattern)
    为其他对象提供代理,以控制对该对象的访问。
    例:Java 中的 java.lang.reflect.Proxy 用于生成动态代理。

3. 行为型模式 (Behavioral Patterns)

这些模式关注对象之间的通信和职责分配。

  • 观察者模式 (Observer Pattern)
    定义对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都得到通知并自动更新。
    例:java.util.ObserverObservable 是观察者模式的实现。

  • 策略模式 (Strategy Pattern)
    定义一系列算法,并将每个算法封装起来,使它们可以互换。
    例:Java 中的 Comparator 接口就是策略模式的实现。

  • 命令模式 (Command Pattern)
    将请求封装为一个对象,从而让用户可以通过不同的请求对客户进行参数化。
    例:在图形应用程序中,每个操作(如移动、缩放)可以被封装成命令对象。

  • 状态模式 (State Pattern)
    允许一个对象在其内部状态改变时改变它的行为。
    例:状态机就是状态模式的一个应用。

  • 责任链模式 (Chain of Responsibility Pattern)
    使多个对象都有机会处理请求,从而避免请求的发送者与接受者之间的耦合关系。
    例:Java 中的 Servlet 请求处理链就是责任链模式。

  • 模板方法模式 (Template Method Pattern)
    定义一个操作中的算法骨架,将一些步骤的实现延迟到子类中。
    例:java.util.AbstractList 中的 add() 方法使用了模板方法模式。

  • 中介者模式 (Mediator Pattern)
    用一个中介对象来封装一组对象之间的交互,使得对象之间不直接交互。
    例:javax.swing 中的 JButtonJTextField 通过 ActionListener 中介来交互。

  • 迭代器模式 (Iterator Pattern)
    提供一种方法来顺序访问一个集合中的元素,而不暴露集合的内部表示。
    例:java.util.Iterator 是迭代器模式的实现。

  • 访问者模式 (Visitor Pattern)
    让你可以在不改变类的前提下,增加新的操作。
    例:编译器的语法树中可以使用访问者模式来遍历各个节点并执行相应的操作。

总结

设计模式可以帮助开发者以更高效、更易维护的方式解决常见的开发问题。理解并应用这些模式能够使你的代码更具灵活性和扩展性。在实际开发中,我们通常不会盲目使用设计模式,而是根据实际需求来选择合适的模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958757.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go语言的栈空间管理

Go 语言的栈空间管理 Go 语言的栈空间管理是其并发模型的核心之一。Go 的运行时环境(runtime)采用动态栈分配机制,能够根据 Goroutine 的需求动态扩展和收缩栈空间,避免了传统固定栈大小的限制。Go 的栈管理经历了从 分块式栈 到…

细说STM32F407单片机电源低功耗StandbyMode待机模式及应用示例

目录 一、待机模式基础知识 1、进入待机模式 2、待机模式的状态 3、退出待机模式 二、待机模式应用示例 1、示例功能和CubeMX项目设置 (1) 时钟 (2) DEBUG、LED1、KeyRight、USART6、CodeGenerator (3&#x…

我谈《概率论与数理统计》的知识体系

学习《概率论与数理统计》二十多年后,在廖老师的指导下,才厘清了各章之间的关系。首先,这是两个学科综合的一门课程,这一门课程中还有术语冲突的问题。这一门课程一条线两个分支,脉络很清晰。 概率论与统计学 概率论…

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道,还有2道找时间再磨一磨。现在把做的一些思路总结如下: 题1:握手问题 问题描述 小蓝组织了一场算法交流会议,总共有 50人参加了本次会议。在会议上,大家进行了握手交流。按照惯例…

OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?

OpenEuler与CentOS的对比 一、基本信息 起源与背景: OpenEuler:由华为发起,后捐赠给开放原子开源基金会,旨在构建一个开放、多元化的云计算和边缘计算平台,以满足华为及其他企业的硬件和软件需求。CentOS:…

【MySQL — 数据库增删改查操作】深入解析MySQL的create insert 操作

数据库CRUD操作 1 CRUD简介 CURD是对数据库中的记录进行基本的增删改查操作: 2. Create 新增 语法 INSERT [INTO] table_name[(column [,column] ...)] VALUES(value_list)[,(value_list)] ... # value 后面的列的个数和类型,要和表结构匹配…

苍穹外卖—订单模块

该模块分为地址表的增删改查、用户下单、订单支付三个部分。 第一部分地址表的增删改查无非就是对于单表的增删改查,较基础,因此直接导入代码。 地址表 一个用户可以有多个地址,同时有一个地址为默认地址。用户还可为地址添加例如&q…

从ChatGPT热潮看智算崛起

2025年1月7日,科智咨询发布《2025年IDC产业七大发展趋势》,其中提到“ChatGPT开启生成式AI热潮,智能算力需求暴涨,算力供给结构发生转变”。 【图片来源于网络,侵删】 为何会以ChatGPT发布为节点呢?咱们一起…

【Uniapp-Vue3】setTabBar设置TabBar和下拉刷新API

一、setTabBar设置 uni.setTabBarItem({ index:"需要修改第几个", text:"修改后的文字内容" }) 二、tabBar的隐藏和显式 // 隐藏tabBar uni.hideTabBar(); // 显示tabBar uni.showTabBar(); 三、为tabBar右上角添加文本 uni.setTabBarBadge({ index:"…

【express-generator】06-RESTFUL API设计(第二阶段)

前言: 前面我们学习了第一阶段的express-generator内容以及做了对应练习,现在我们正式开始第二阶段的学习以及练习。本篇介绍的内容是RESTFUL API设计。 第二阶段的大纲如下: RESTful API 设计: 学习如何设计符合 REST 原则的 …

Python 预训练:打通视觉与大语言模型应用壁垒——Python预训练视觉和大语言模型

大语言模型是一种由包含数百亿甚至更多参数的深度神经网络构建的语言模型,通常使用自监督学习方法通过大量无标签文本进行训练,是深度学习之后的又一大人工智能技术革命。 大语言模型的发展主要经历了基础模型阶段(2018 年到2021年)、能力探索阶段(2019年…

【深度学习】2.视觉问题与得分函数

计算机视觉任务 可以通过神经网络搜索是什么类别的动物。 图像实际就是含有数值的三维矩阵。 像素值从0-255可以表示亮度递增的参数。数字越大,像素点越亮。 最后的3表示三个颜色通道,常见的如JPG、RGB等。 现实场景容易发生各种遮蔽现象。 计算机判断…

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…

使用Edge打开visio文件

使用Edge打开visio文件 打开Edge浏览器搜索‘vsdx edge’ 打开第一个搜索结果 Microsoft Support 根据上述打开的页面进行操作 第一步&#xff1a;安装Visio Viewer 第二步&#xff1a;添加注册表 桌面新增文本文件&#xff0c;将下面的内容放入新建文本中&#xff0c;修…

基于微信小程序的健身管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

GPS信号生成:C/A码序列生成【MATLAB实现】

GPS C/A码序列生成【MATLAB实现】 在本文中&#xff0c;将简要介绍GPS C/A码及其生成原理&#xff0c;并且用MATLAB代码实现。 GPS信号与C/A码 GPS的信号主要有三类&#xff1a;载波&#xff08;carrier&#xff09;、测距码&#xff08;也可以说是伪随机噪声码&#xff0c;…

redis离线安装部署详解(包括一键启动)

像上文一样 因为在学习的过程中没有查到一个详细的离线部署方案 所以在自己学习之后想要自己写一个文章 希望可以帮助后续学习redis离线部署的朋友少走一线弯路 首先就是下载安装包 可以自己在本地下载再传到机器上&#xff08;通过xftp或lrzsz都可&#xff09; http://d…

Hadoop•搭建完全分布式集群

听说这里是目录哦 一、安装Hadoop&#x1f955;二、配置Hadoop系统环境变量&#x1f96e;三、验证Hadoop系统环境变量是否配置成功&#x1f9c1;四、修改Hadoop配置文件&#x1f36d;五、分发Hadoop安装目录&#x1f9cb;六、分发系统环境变量文件&#x1f368;七、格式化HDFS文…

安卓动态设置Unity图形API

命令行方式 Unity图像api设置为自动,安卓动态设置Vulkan、OpenGLES Unity设置 安卓设置 创建自定义活动并将其设置为应用程序入口点。 在自定义活动中,覆盖字符串UnityPlayerActivity。updateunitycommandlineararguments (String cmdLine)方法。 在该方法中,将cmdLine…

Java春招面试指南前言

在当今竞争激烈的就业市场中&#xff0c;对于即将踏入职场的Java开发者而言&#xff0c;春招是一次宝贵的机会。本博客专栏旨在为大家提供一份全面且实用的Java春招面试指南&#xff0c;助力大家顺利通过面试&#xff0c;开启职业生涯的新篇章。 无论你是初出茅庐的应届生&…