Java常用设计模式

常用的设计模式(Java 实现) 设计模式是软件开发中非常重要的一部分,掌握常用的设计模式能够帮助我们解决很多常见的设计问题。本文介绍了单例模式工厂方法模式观察者模式策略模式装饰器模式代理模式等几种常用的设计模式。通过 Java 示例,我们可以清晰地理解每个设计模式的作用和实现方式。掌握设计模式能够提高代码的可维护性、可扩展性和灵活性,使得开发人员能够更加高效地设计和构建复杂的应用程序。 阅读详情

        设计模式是软件开发中解决常见问题的模板或指南。Java中的23种设计模式通常被分为三大类:创建型(Creational Patterns)、结构型(Structural Patterns)和行为型(Behavioral Patterns)。


创建型模式


1.单例模式(Singleton Pattern)

        定义:确保一个类只有一个实例,并提供全局访问点。
        用途:全局配置管理、数据库连接池等需要唯一实例的场景。

// 单例模式:确保一个类只有一个实例,并提供全局访问点
public class Singleton {
    // 使用volatile防止指令重排,确保线程安全
    private static volatile Singleton instance;
    
    // 私有构造器防止外部实例化
    private Singleton() {}
    
    // 双重检查锁定(Double-Check Locking)
    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次检查
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

// 调用
public class Main {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
    }
}

2.工厂方法模式(Factory Method Pattern)

        定义:定义一个创建对象的接口,但由子类决定实例化哪个类。
        用途:解耦对象的创建与使用(如不同数据库驱动)。

// 1. 产品接口 (Product Interface)
interface Shape {
    void draw();
}

// 2. 具体产品类 (Concrete Products)
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Circle.");
    }
}

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

// 3. 创建者/工厂接口 (Creator/Factory Interface)
//    核心:工厂方法 createShape() 由子类实现。
interface ShapeFactory {
    Shape createShape(); // 这就是“工厂方法”
}

// 4. 具体创建者/工厂类 (Concrete Creators)
//    每个具体工厂负责创建一个具体产品。
class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

class RectangleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

// 5. 客户端使用 (Client Code)
public class FactoryPatternDemo {
    public static void main(String[] args) {
        // 客户端代码只依赖抽象接口(Shape和ShapeFactory)
        // 需要什么产品,就使用对应的工厂
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw(); // Output: Drawing a Circle.

        ShapeFactory rectangleFactory = new RectangleFactory();
        Shape rectangle = rectangleFactory.createShape();
        rectangle.draw(); // Output: Drawing a Rectangle.
        
        // 优点:如果要新增一个Triangle,只需要新增Triangle类和TriangleFactory类,
        // 无需修改任何现有工厂和客户端的代码,完全符合“开闭原则”。
    }
}

3.建造者模式(Builder Pattern)

        定义:将复杂对象的构建过程分离,允许逐步构造不同表示形式。
        用途:创建复杂对象(如SQL查询构造器)。

// 产品类(复杂对象)
class Car {
    private String engine;
    private String tires;
    
    // 内部Builder类
    static class Builder {
        private String engine;
        private String tires;
        
        public Builder engine(String engine) {
            this.engine = engine;
            return this;
        }
        
        public Builder tires(String tires) {
            this.tires = tires;
            return this;
        }
        
        public Car build() {
            return new Car(this);
        }
    }
    
    // 私有构造器,通过Builder创建
    private Car(Builder builder) {
        this.engine = builder.engine;
        this.tires = builder.tires;
    }
}

// 调用
public class Main {
    public static void main(String[] args) {
        Car car = new Car.Builder()
            .engine("V8")
            .tires("All-Terrain")
            .build();
    }
}


结构型模式


1.适配器模式(Adapter Pattern)

        定义:将一个类的接口转换成客户端期望的另一个接口。
        用途:兼容旧代码或第三方库(如USB转Type-C适配器)。

// 旧接口
interface OldSystem {
    void oldMethod();
}

// 适配的目标接口
interface NewSystem {
    void newMethod();
}

// 适配器:将旧接口适配为新接口
class Adapter implements NewSystem {
    private OldSystem oldSystem;
    
    public Adapter(OldSystem oldSystem) {
        this.oldSystem = oldSystem;
    }
    
    @Override
    public void newMethod() {
        oldSystem.oldMethod(); // 调用旧方法
    }
}

// 旧系统实现
class OldImplementation implements OldSystem {
    @Override
    public void oldMethod() {
        System.out.println("Old method called");
    }
}

// 调用
public class Main {
    public static void main(String[] args) {
        OldSystem old = new OldImplementation();
        NewSystem adapter = new Adapter(old);
        adapter.newMethod(); // 通过适配器调用旧方法
    }
}

2.装饰者模式(Decorator Pattern)

        定义:动态地为对象添加额外职责,通过包装原始对象实现。
        用途:扩展功能而不修改类(如为咖啡添加牛奶、糖)。

// 组件接口
interface Coffee {
    String getDescription();
    double cost();
}

// 具体组件
class SimpleCoffee implements Coffee {
    @Override
    public String getDescription() {
        return "Simple Coffee";
    }
    
    @Override
    public double cost() {
        return 2.0;
    }
}

// 装饰者抽象类
abstract class CoffeeDecorator implements Coffee {
    protected Coffee decoratedCoffee;
    
    public CoffeeDecorator(Coffee decoratedCoffee) {
        this.decoratedCoffee = decoratedCoffee;
    }
    
    @Override
    public String getDescription() {
        return decoratedCoffee.getDescription();
    }
    
    @Override
    public double cost() {
        return decoratedCoffee.cost();
    }
}

// 具体装饰者(添加牛奶)
class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee decoratedCoffee) {
        super(decoratedCoffee);
    }
    
    @Override
    public String getDescription() {
        return super.getDescription() + ", Milk";
    }
    
    @Override
    public double cost() {
        return super.cost() + 0.5;
    }
}

// 调用
public class Main {
    public static void main(String[] args) {
        Coffee coffee = new SimpleCoffee();
        coffee = new MilkDecorator(coffee);
        System.out.println(coffee.getDescription() + " $" + coffee.cost());
    }
}

3.代理模式(Proxy Pattern)

        定义:为其他对象提供一个代理,以控制对这个对象的访问。
        用途:延迟加载、权限控制(如虚拟代理、安全代理)。

// 主题接口
interface Subject {
    void request();
}

// 真实主题
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject handling request");
    }
}

// 代理
class Proxy implements Subject {
    private RealSubject realSubject;
    
    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        // 代理逻辑(如权限检查)
        System.out.println("Proxy: Checking access...");
        realSubject.request();
    }
}

// 调用
public class Main {
    public static void main(String[] args) {
        Subject proxy = new Proxy();
        proxy.request();
    }
}

行为型模式


1.观察者模式(Observer Pattern)

        定义:定义对象间的一对多依赖,当一个对象状态改变时,自动通知依赖它的对象。
        用途:事件处理系统(如消息订阅、UI数据更新)。

// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 观察者接口
interface Observer {
    void update(String message);
}

// 具体主题
class WeatherStation implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String weatherData;
    
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    
    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(weatherData);
        }
    }
    
    public void setWeatherData(String data) {
        this.weatherData = data;
        notifyObservers();
    }
}

// 具体观察者
class WeatherDisplay implements Observer {
    @Override
    public void update(String message) {
        System.out.println("WeatherDisplay received: " + message);
    }
}

// 调用
public class Main {
    public static void main(String[] args) {
        WeatherStation station = new WeatherStation();
        WeatherDisplay display = new WeatherDisplay();
        station.registerObserver(display);
        station.setWeatherData("Sunny");
    }
}

2.策略模式(Strategy Pattern)

        定义:定义一系列算法并封装它们,使可以独立于使用它的功能而变化。
        用途:动态切换行为(如排序算法、支付方式选择)。

// 策略接口
interface PaymentStrategy {
    void pay(int amount);
}

// 具体策略(信用卡支付)
class CreditCardStrategy implements PaymentStrategy {
    private String cardNumber;
    
    public CreditCardStrategy(String cardNumber) {
        this.cardNumber = cardNumber;
    }
    
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using Credit Card");
    }
}

// 上下文
class Order {
    private PaymentStrategy strategy;
    
    public void setPaymentStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }
    
    public void placeOrder(int amount) {
        strategy.pay(amount);
    }
}

// 调用
public class Main {
    public static void main(String[] args) {
        Order order = new Order();
        order.setPaymentStrategy(new CreditCardStrategy("1234-5678"));
        order.placeOrder(100);
    }
}

3.命令模式(Command Pattern)

        定义:将请求封装为对象,以便参数化、队列化或记录请求。
        用途:实现撤销/重做、任务队列(如编辑器操作记录)。

// 命令接口
interface Command {
    void execute();
}

// 接收者(执行实际操作)
class Light {
    public void turnOn() {
        System.out.println("Light turned ON");
    }
    
    public void turnOff() {
        System.out.println("Light turned OFF");
    }
}

// 具体命令(开灯)
class TurnOnCommand implements Command {
    private Light light;
    
    public TurnOnCommand(Light light) {
        this.light = light;
    }
    
    @Override
    public void execute() {
        light.turnOn();
    }
}

// 调用者(Invoker)
class RemoteControl {
    private Command command;
    
    public void setCommand(Command command) {
        this.command = command;
    }
    
    public void pressButton() {
        command.execute();
    }
}

// 调用
public class Main {
    public static void main(String[] args) {
        Light light = new Light();
        Command command = new TurnOnCommand(light);
        RemoteControl remote = new RemoteControl();
        remote.setCommand(command);
        remote.pressButton();
    }
}

java几种常用的设计模式 -------------------------------java几种常用的设计模式-------------------------------------------------------------------------------------------------------------------------- 立即下载

相关推荐

hi3519dv500 os04a10输入调试

因该sensor接在soc端的iic6,在驱动中(Hi3519DV500_SDK_V2.0.1.1\smp\a55_linux\source\mpp\cbb\isp\user\sensor\hi3519dv500\omnivision_os04a10\os04a10_sensor_ctl.c)注意总线的选择。mem_process_isolation=1 改为 mem_process_isolation=0。2、OT_MIPI_SET_HS_MODE配置为LANE_DIVIDE_MODE_1。

linus 3169

Java常见设计模式

​ 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。可以通过“抽象约束、封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。

weixin_48453772的博客 254

RDP Wrapper失效了?别慌!教你如何手动为Windows 10/11最新版本添加rdpwrap.ini配置

本文详细介绍了当RDP Wrapper在Windows 10/11最新版本中失效时,如何手动添加rdpwrap.ini配置以恢复多用户远程桌面功能。通过获取最新配置文件、安全替换配置的完整流程以及高级手动配置技巧,帮助用户解决[Not support]问题,确保远程工作流程不受系统更新影响。

weixin_30765577的博客 624

Java七种常用设计模式

抽象工厂模式(Abstract Factory Pattern)是Java中常用的一种创建型设计模式,它提供了一种创建一系列相关或相互依赖的对象接口,而无需指定它们具体的类。抽象工厂模式和工厂方法模式类似,不同之处在于抽象工厂模式中工厂类不单独生产一种产品,而是生产一系列相关的产品。定义抽象产品类:void use();定义具体产品类:System . out . println("使用ProductA1");System . out . println("使用ProductA2");

qq_45196093的博客 2万+

【OpenStack】OpenStack原理(一)——OpenStack发展及架构

OpenStack目前的七个核心组件,分别是计算(Compute)、对象存储(Object Storage)、认证(Identity)、用户界面(Dashboard)、块存储(Block Storage)、网络(Network)和镜像服务(Image Service)。

大数据分析BDA 2万+

硬盘dma读写过程

保护模式中,pci上的硬盘dma读写方法

480

Java设计模式全解析(共 23 种)

Java 中的设计模式是为了解决在软件开发中常见问题的一些“最佳实践”总结。设计模式分为三大类,共 23 种经典模式:

xxiaobaibaibai的博客 1135

【系统架构设计师】预测试卷十:综合知识(75道选择题)

本文包含75道选择题,覆盖计算机系统、操作系统、网络、数据库、软件工程等核心知识域,其中系统架构设计与评估占比最高(19题)。题目难度稍高,注重灵活应用,题干全新且不与前8套重复。部分典型题目解析包括:计算机性能比较(CPU时间公式TLB/页表机制)、Cache写策略、流水线分支惩罚、管程条件变量、LRU近似算法、自旋锁适用场景、TCP字节流特性、Anycast应用、MVCC机制、分布式事务选型等。答案详解强调易错点,如性能比较需综合计算、TLB缺失不等于缺页、

数据知道的博客 478

Java几种常见的设计模式

--------------------- 本文来自 旭日Follow_24 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/xuri24/article/details/81106656?utm_source=copy 一、单例模式 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 常见写法: 懒汉式 public class Singlet...

weixin_30260399的博客 608

【WorkBuddy专栏58】腾讯为什么要「自己打自己」——7款AI智能体产品全景对比与「赛马」逻辑深度拆解

【WorkBuddy专栏57】你的左侧空间不是「日任务清单」——工作空间才是 WB 变聪明的核心秘密

AI人人懂 679

基于Simulink实现电动汽车电机驱动系统的建模与仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车电机驱动系统的建模与仿真。该系统能够全面评估电机驱动系统的性能,验证控制策略的有效性,并通过优化设计提高车辆的动力性和效率。引入智能预测:结合人工智能技术,实现更智能的控制策略。扩展功能:增加对多种电机类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 317

JAVA最全设计模式(23种并附带示例)

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。定义: 创建型设计模式主要用于对象的创建过程,对对象的创建进行抽象,隐藏对象创建的具体逻辑。给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

qq_45105233的博客 8570

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java常用设计模式大全

单例模式属于创建型模式,⼀个单例类在任何情况下都只存在⼀个实例, 构造方法必须是私有的、由自己创建⼀个静态变量存储实例,对外提供⼀ 个静态公有方法获取实例优点是内存中只有一个实例,减少了开销,尤其是频繁创建和销毁实例的情况下并且可以避免对资源的多重占用,缺点是没有抽象层,难以扩展,与单一职责原则冲突单例类,只能创建一个实例的类访问类,使用单例类在我们的应⽤程序中我们可能需要将两个不同接口的类来进⾏通信,在不 修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。这个中间件就是适配器。

2402_83510798的博客 1100

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java面试——讲一下常用的设计模式

​GoF 设计模式:23 种,分为创建型、结构型和行为型三大类。​其他设计模式:随着技术的发展,许多新的设计模式被提出,扩展了设计模式的范畴,以适应不同的开发需求和场景。理解并熟练应用这些设计模式,可以显著提高代码的可维护性、可复用性和灵活性,是每个软件开发人员必备的技能之一。设计模式通常分为三大类:​创建型模式结构型模式和 ​行为型模式。下面我们将详细介绍常用的设计模式。设计模式是软件开发中的最佳实践,不同的设计模式适用于不同的场景。

2401_86405063的博客 1282

常用的JAVA设计模式

工厂方法模式(pattern of factory method)是一种创建型设计模式,它定义了一个用于创建对象的接口,但将实际创建对象的工作延迟到子类中,这样可以在不改变整体结构的情况下,通过子类来选择具体实现。创建不同的表示:在不同的情况下,可以通过相同的构建过程创建不同的对象表示。总结: 上面总结的是一些常用的设计模式,还有很多其他的设计模式,如下图,我们可以根据自己的需求选取自己需要的设计模式。类的个数增加: 每增加一个产品,就需要增加一个具体产品类和一个对应的工厂类,使得系统中类的个数成倍增加。

weixin_46455584的博客 1266

java中常用的5种设计模式

【代码】java业务开发中常用的5种设计模式。

qq_41659974的博客 5790

常用设计模式Java——Design pattern

设计模式 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码复用,增加可维护性 面向对象思想设计原则 单一职责原则 高内聚、低耦合 每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。 开闭原则 核心思想是:一个对象对扩展开放,对修改关闭。 对类的改动是通过增加代码进行的,而不...

pc_zkr的博客 1634

Java常用的几种设计模式

  本来想写点spring相关的东西的,想来想去,先写点设计模式的东西吧   什么是设计模式?套用百度百科的话解释吧   设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。   这...

weixin_30369041的博客 185

Java常用设计模式总结

前言:鸿洋大神的设计模式系列博客已经阅读完毕,下面来做个总结。 Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式) 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式分为三种类型,共23种: 创建型模式:单例模式、抽象工厂模式、建造者模式、

wu371894545的博客 1万+

java常用设计模式总结

1、关联关系 双向或者单向 实线可以有箭头,箭头指向被关联的类 2、聚合关系 整体和部分的关系,部分脱离整体可以存在 实线空心菱形 指向整体 比如大学和老师 3、组合关系 整体和部分的关系,部分脱离整体不可以存在 实线实心菱形 指向整体 比如头和嘴巴 4、泛化(继承关系) 实线三角空心箭头指向父类 5、实现关系三角空心箭头指向父类 6、依赖关系 带箭头的指向原则依赖的类只要和是虚线。

weixin_72835664的博客 711

java常用必须掌握的设计模式

java设计模式之单例模式 设计模式是前人总结的一种程序设计思想。 单例模式: 这个类的对象只能有一个。 单例模式实现步骤 1.私有化构造器 2.构造一个方法或者这个类的对象,返回类型为这个类 //单例之懒汉,节省资源,只有自己使用这个对象时才创建 class Singleton{ static Singleton s; //私有化构造器 private Singleton...

java川 230
上一篇: MyBatis的<association>、<collection>(补档)
下一篇: RocketMQ详解
快乐吃手手  :  )
博客等级 码龄6年 119粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值