【Java】 Java设计模式

白白胖胖,充满希望~

文章目录

  • [1. 工厂模式](#1. 工厂模式)
    • [1.1 工厂模式运用场景](#1.1 工厂模式运用场景)
  • [2. 单例模式](#2. 单例模式)
    • [2.1 单例模式运用场景](#2.1 单例模式运用场景)
  • [3. 建造者模式](#3. 建造者模式)
    • [3.1 使用场景](#3.1 使用场景)
  • [4. 策略模式](#4. 策略模式)
    • [4.1 应用场景](#4.1 应用场景)

1. 工厂模式

Java工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需将对象的创建逻辑暴露给客户端代码。工厂模式通过定义一个工厂方法来创建对象,而客户端只需要调用该工厂方法即可获得所需对象,从而实现了对象的创建和使用的分离。

在Java中,工厂模式通常包括以下几个角色:

抽象产品(Product):定义了产品对象的通用接口,所有具体产品都必须实现这个接口。

具体产品(Concrete Product):实现了抽象产品接口的具体类,在工厂方法中将被创建。

抽象工厂(Factory):定义了工厂方法,用于创建产品对象的接口。

具体工厂(Concrete Factory):实现了工厂方法,返回具体产品对象的实例。

1.1 工厂模式运用场景

当需要在运行时根据某些条件创建对象时,可以使用工厂模式。例如,如果您正在构建一个游戏,每当用户选择一个角色时,您都希望创建一个相应的角色类的实例,则可以使用工厂模式。

如果需要隐藏特定类或者实现的细节并只暴露一个接口,那么您可以使用工厂模式。这使得客户端代码更加灵活和易于维护。

工厂模式还可以用于解决依赖性注入问题。如果您有一个类,它需要依赖于其他类的实例,并且您想要通过工厂来管理这些依赖项,那么使用工厂模式可以很好地解决此问题。

2. 单例模式

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供全局访问点来访问该实例。

2.1 单例模式运用场景

单例模式通常用于需要保证全局只有一个实例对象的场景,例如:

数据库连接池:在应用程序中,数据库连接池是一种重要的资源,如果每次使用时都创建一个新的连接,会影响应用程序的性能。因此,将数据库连接池实现为单例可以避免创建多个连接,从而提高应用程序的性能。

日志记录器:在应用程序中,日志记录器是一种常见的工具,它可以用来记录应用程序的运行状态以及错误信息。由于日志记录器在整个应用程序中都会被使用,因此将其实现为单例可以确保所有的日志记录都进入同一个文件或者数据库中,便于统一管理和查看。

配置文件管理器:在应用程序中,配置文件通常用来存储应用程序的配置信息,例如数据库连接参数、服务器地址等。将配置文件管理器实现为单例可以确保所有的配置信息都被正确地加载,并且不会出现重复加载的情况。

总之,单例模式适用于任何需要确保全局只有一个实例对象的场景,特别是那些需要经常访问的对象,因为它可以帮助我们降低对象的创建和销毁成本,提高系统的性能和可维护性。

3. 建造者模式

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

public class User {
    private String name;
    private int age;
    private String email;

    private User(UserBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.email = builder.email;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getEmail() {
        return email;
    }

    public static class UserBuilder {
        private String name;
        private int age;
        private String email;

        public UserBuilder(String name, int age, String email) {
            this.name = name;
            this.age = age;
            this.email = email;
        }

        public User build() {
            return new User(this);
        }
    }
}

在上面的代码中,我们定义了一个User类和一个内部类UserBuilder,在UserBuilder类中定义了三个属性:name、age和email,并提供了一个build()方法来返回一个User对象。这个UserBuilder类可以用来初始化User对象的属性,如下所示:

User user = new User.UserBuilder("Tom", 18, "tom@example.com").build();

3.1 使用场景

建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的构造过程和表示分离,从而使得相同的构造过程可以创建不同的表示形式。建造者模式通常适用于以下情况:

创建一个复杂的对象,其构造需要多个步骤或者涉及到多个可选组件。

需要在某些步骤中灵活地配置对象的构造过程,以满足不同的需求。

需要隐藏对象的构造细节,防止客户端直接访问构造函数。

需要避免构造函数参数列表过长,难以管理和维护。

建造者模式通过将构造过程分解为多个步骤,并提供一个统一的接口来指导这些步骤的执行顺序,使得客户端可以更加方便地创建所需的对象,同时也能够灵活地配置其构造过程,提高代码的可读性、可维护性和可扩展性。

4. 策略模式

Java 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一组算法,将每个算法都封装起来,使得它们之间可以互换。策略模式让算法的变化独立于使用算法的客户端,从而提高了代码的灵活性和可复用性。

在 Java 中,策略模式通常包括以下角色:

Context:上下文对象,持有一个对策略对象的引用,并将具体的任务委托给策略对象进行处理。

Strategy:策略接口,定义了所有支持的算法的公共接口。

ConcreteStrategy:具体策略类,实现策略接口中定义的算法,完成具体的任务。

4.1 应用场景

以下是Java策略模式的一些应用场景:

各种排序算法:在排序算法中,我们可以定义一个Comparator接口,并实现不同的比较器算法,这些算法可以根据具体需求灵活地进行切换。

图像处理:在图像处理中,我们可以定义一个Filter接口,并实现不同的滤镜算法,这些算法可以根据用户需要动态地选择和切换。

支付方式选择:在电商网站中,用户可以根据自己的需求选择不同的支付方式,而定义一个PaymentStrategy接口并实现不同的支付算法就可以实现这一功能。

游戏角色攻击方式:在游戏中,我们可以定义一个AttackStrategy接口,并实现不同的攻击算法,这些算法可以根据不同的游戏角色进行灵活切换。

适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。

装饰者模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能而言,比生成子类更为灵活。

观察者模式(Observer Pattern):定义对象间的一种一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动得到通知。

迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象中的每个元素,而又不暴露该对象的内部表示。

模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。

相关推荐
闲人一枚(学习中)几秒前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
hopetomorrow7 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
不是二师兄的八戒17 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
小牛itbull17 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i26 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落28 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
爱编程的小生29 分钟前
Easyexcel(2-文件读取)
java·excel
GIS瞧葩菜38 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming198742 分钟前
STL关联式容器之set
开发语言·c++
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法