设计模式——单例模式

一。引言

当我们写一个体量比较大的代码使,如果这是堆积罗列,那么会发现有许多冗余的情况,并且还不利于团队共同协作,代码难以定位。

于是为了解决这些问题,提高代码的可读性,减少耦合度,我们引入了设计模式。

设计模式就像盖房子时的图纸,根据这些图纸的指导可以让我们把房子建的更漂亮,当然,设计模式肯定也不是一种,要根据具体需要选择最合适的使用。

二。设计模式的种类

设计模式很多,并且根据不同的角度还可以划分许多种。

1. 创建型模式:
- 工厂模式(Factory Pattern)
- 抽象工厂模式(Abstract Factory Pattern)
- 单例模式(Singleton Pattern)
- 建造者模式(Builder Pattern)
- 原型模式(Prototype Pattern)

2. 结构型模式:
- 适配器模式(Adapter Pattern)
- 桥接模式(Bridge Pattern)
- 装饰器模式(Decorator Pattern)
- 组合模式(Composite Pattern)
- 外观模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 代理模式(Proxy Pattern)

3. 行为型模式:
- 策略模式(Strategy Pattern)
- 观察者模式(Observer Pattern)
- 模板方法模式(Template Method Pattern)
- 迭代器模式(Iterator Pattern)
- 命令模式(Command Pattern)
- 备忘录模式(Memento Pattern)
- 状态模式(State Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 访问者模式(Visitor Pattern)
- 中介者模式(Mediator Pattern)
- 解释器模式(Interpreter Pattern)

三。单例模式

单例模式:是指在内存中只创建且仅创建一次对象的设计模式。

懒汉式:被需要时进行创建。

饿汉式:类加载时已经被创建,等待程序被使用。

今天介绍一下单例模式,单例模式又分为两种,分别是懒汉式单例模式饿汉式单例模式。顾名思义,单例模式就是只有一个实例,确保一个类只实例化一次。而懒汉式就是懒得实例化,不得不实例化的时候再进行,一般在首次访问时才会实例化。而饿汉式就很着急,一般在类加载的时候就进行了实例化。两种各有使用情况。

(1)懒汉式单例模式

代码:

public class Singleton {
    
    private static volatile Singleton singleton;
    
    private Singleton(){}
    
    public static Singleton getInstance() {
        if (singleton == null) {  // 线程A和线程B同时看到singleton = null,如果不为null,则直接返回singleton
            synchronized(Singleton.class) { // 线程A或线程B获得该锁进行初始化
                if (singleton == null) { // 其中一个线程进入该分支,另外一个线程则不会进入该分支
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
    
}

为什么要加锁:是为了解决线程安全的问题,以免两个线程同时去实例化对象。

volatile:是防止指令重排。

(2)饿汉式单例模式

代码:

public class Singleton{
    
    private static final Singleton singleton = new Singleton();
    
    private Singleton(){}
    
    public static Singleton getInstance() {
        return singleton;
    }
}

实际使用单例模式的例子:

日志记录器,在一个应用程序中,我们通常只需要一个日志记录器来记录各种信息,例如错误日志、调试日志等。使用单例模式可以保证在整个应用程序中只有一个日志记录器实例存在,并提供全局访问点来记录日志消息。

public class Logger {
    private static Logger instance;
    
    private Logger() {
        // 私有化构造方法
    }
    
    public static Logger getInstance() {
        if (instance == null) {
            synchronized(Logger.class) {
                if (instance == null) {
                    instance = new Logger();
                }
            }
        }
        return instance;
    }
    
    public void log(String message) {
        // 记录日志
        System.out.println(message);
    }
}

在上面的示例中,`Logger`类是一个单例类,通过`getInstance()`方法获取唯一的实例。在调用`log()`方法时,可以通过`Logger.getInstance().log("message")`来记录日志消息。
在整个应用程序中,无论在何处调用`Logger.getInstance()`来获取实例,都会返回同一个日志记录器实例,确保了日志的一致性和全局可访问性。

参考了这篇文章,讲的真的非常详细!

我给面试官讲解了单例模式后,他对我竖起了大拇指!-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值