首页 > 其他分享 >设计模式——单例模式

设计模式——单例模式

时间:2024-05-30 23:59:16浏览次数:21  
标签:Singleton Pattern singleton 模式 单例 Logger 设计模式

一。引言

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

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

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

二。设计模式的种类

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

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博客

标签:Singleton,Pattern,singleton,模式,单例,Logger,设计模式
From: https://blog.csdn.net/weixin_63424693/article/details/139280670

相关文章

  • 广告电商新玩法:链动2+1模式下的社交电商新体验
    广告电商+链动2+1商业模式解析一、商业模式概述广告电商+链动2+1商业模式是一种创新的电商模式,它将广告电商与链动2+1模式相结合,形成了一种全新的商业模式。在这种模式下,电商平台通过引入广告商投放广告,并将部分广告收益以积分或优惠券的形式返还给消费者,以此吸引和留住用户......
  • 广告电商新动力:链动2+1模式下的用户参与与裂变
    广告电商+链动2+1商业模式解析一、商业模式概述广告电商+链动2+1商业模式是一种创新的电商模式,它将广告电商与链动2+1模式相结合,形成了一种全新的商业模式。在这种模式下,电商平台通过引入广告商投放广告,并将部分广告收益以积分或优惠券的形式返还给消费者,以此吸引和留住用户......
  • 加盟招商合作模式全攻略:如何选择合适的合作伙伴?
    在当下竞争激烈的商业环境中,加盟招商合作模式成为了品牌扩张、快速占领市场的重要手段。然而,如何选择合适的合作伙伴,确保双方能够携手共进、实现共赢,是每个品牌都需要深思的问题。作为一名手工酸奶品牌的创始人,目前全国也复制了100多家门店。本文将从品牌发展的角度出发,为您揭......
  • 深入理解Java的设计模式
    设计模式(DesignPatterns)是软件开发中的宝贵经验总结,提供了解决常见设计问题的模板和最佳实践。在Java开发中,设计模式尤为重要,因为它们能够提高代码的可维护性、可扩展性和可重用性。本篇博客将详细介绍几种常见的设计模式,帮助读者掌握如何在Java开发中应用这些模式。什么是设......
  • C++设计模式的原则
    1、依赖倒置原则(DIP)·高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象稳定)。·抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。2、开放封闭原则(OCP)·对扩展开放,对更改封闭。·类模块应该是可扩展的,但是不可修改。3、单一职责原......
  • 23种设计模式之适配器模式
    适配器模式1、定义适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。2、适配器模式结构Target(目标抽象类):定义客户所需要的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于Ja......
  • 23种设计模式之原型模式
    原型模式1、定义原型模式:使用原型实例指定要创建对象的类型,并且通过复制这个类型来创建新的对象。2、深克隆与浅克隆根据在复制原型对象的同时是否复制包含在原型对象中引用类型的成员变量,克隆机制可以分为浅克隆和深克隆。2.1浅克隆简单来说浅克隆就是原型对象被复......
  • 设计模式-策略模式
    在软件开发中,我们经常会遇到在实现一个功能的时候会有多种不同的途径,每一个途径都对应一种算法,此时我们可以使用策略模式来实现灵活地选择解决途径。策略模式的定义在策略模式中,定义了一些独立的类来封装不同的算法,每个类封装一种具体的算法。每个封装算法的类都可以称......
  • 前端学习-Dart官方文档学习-003-模式匹配
    官方文档链接简介匹配和解构//匹配consta='a';constb='b';switch(obj){//Listpattern[a,b]matchesobjfirstifobjisalistwithtwofields,//thenifitsfieldsmatchtheconstantsubpatterns'a'and'b'.c......
  • 智能监控技术助力山林生态养鸡:打造智慧安全的养殖新模式
    随着现代科技的不断发展,智能化、自动化的养殖方式逐渐受到广大养殖户的青睐。特别是在山林生态养鸡领域,智能化监控方案的引入不仅提高了养殖效率,更有助于保障鸡只的健康与安全。视频监控系统EasyCVR视频汇聚/安防监控视频管理平台在山林生态养鸡场景中也发挥了重要的作用。一、方......