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

设计模式—单例模式

时间:2023-07-25 13:00:21浏览次数:31  
标签:模式 teacher static private 单例 设计模式 public ClassTeacher

目录

定义:确保某一个类只有一个实例, 而且自行实例化向整个系统提供这个实例

优点

  • 由于单例模式在内存中只有一个实例, 减少了内存开支, 特别是一个对象需要频繁地创建、 销毁时, 而且创建或销毁时性能又无法优化, 单例模式的优势就非常明显。
  • 由于单例模式只生成一个实例, 所以减少了系统的性能开销, 当一个对象的产生需要比较多的资源时, 如读取配置、 产生其他依赖对象时, 则可以通过在应用启动时直接产生一个单例对象, 然后用永久驻留内存的方式来解决(在Java EE中采用单例模式时需要注意JVM垃圾回收机制) 。
  • 单例模式可以避免对资源的多重占用 。
  • 单例模式可以在系统设置全局的访问点, 优化和共享资源访问 。

缺点

  • 单例模式一般没有接口, 扩展很困难, 若要扩展, 除了修改代码基本上没有第二种途径可以实现。

  • 单例模式对测试是不利的。

  • 单例模式与单一职责原则有冲突。

使用场景

  • 要求生成唯一序列号的环境 。
  • 整个项目中需要一个共享访问点或共享数据 。
  • 创建一个对象需要消耗的资源过多, 如要访问IO和数据库等资源。
  • 需要定义大量的静态常量和静态方法(如工具类) 的环境, 可以采用单例模式(当然, 也可以直接声明为static的方式)。

注意事项

在高并发情况下, 请注意单例模式的线程同步问题。

案例分析

一个班级只有一个班主任。

  • 线程不安全的懒汉模式:
/**
 * 线程不安全的懒汉模式
 *
 * @author admin
 */
public class ClassTeacher {
    private static ClassTeacher teacher;

    private ClassTeacher() {
    }

    public static ClassTeacher init() {
        if (teacher == null) {
            teacher = new ClassTeacher();
        }
        return teacher;
    }

    public void showMsg() {
        System.out.println("Hello World!");
    }
}
  • 线程安全的懒汉模式
/**
 * 线程安全的懒汉模式
 *
 * @author admin
 */
public class ClassTeacher {
    private static ClassTeacher teacher;

    private ClassTeacher() {
    }

    public synchronized static ClassTeacher init() {
        if (teacher == null) {
            teacher = new ClassTeacher();
        }
        return teacher;
    }

    public void showMsg() {
        System.out.println("Hello World!");
    }
}
  • 线程安全的饿汉模式
/**
 * 饿汉模式
 *
 * @author admin
 */
public class ClassTeacher {
    private static ClassTeacher teacher = new ClassTeacher();

    private ClassTeacher() {
    }

    public void showMsg() {
        System.out.println("Hello World!");
    }
}
  • 双检锁/双重校验锁
/**
 * 双校验
 *
 * @author admin
 */
public class ClassTeacher {
    private static volatile ClassTeacher teacher;

    private ClassTeacher() {
    }

    public static ClassTeacher init() {
        if (teacher == null) {
            synchronized (ClassTeacher.class) {
                if(teacher == null){
                    teacher = new ClassTeacher();
                }
            }
        }
        return teacher;
    }
}
  • 登记式/静态内部类
/**
 * 静态内部类
 *
 * @author admin
 */
public class ClassTeacher {
    private static class ClassTeacherHolder {
        private static final ClassTeacher INSTANCE = new ClassTeacher();
    }

    private ClassTeacher() {
    }

    public static final ClassTeacher init() {
        return ClassTeacherHolder.INSTANCE;
    }
}

标签:模式,teacher,static,private,单例,设计模式,public,ClassTeacher
From: https://www.cnblogs.com/kouhao/p/17579618.html

相关文章

  • 设计模式—命令模式
    命令模式目录命令模式命令模式与策略模式的差异:例子命令模式是一个高内聚的模式,其定义为:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。命令模式(CommandPattern)是一种数据驱动的设计模式,它属于行为......
  • 设计模式—解释器模式
    解释器模式解释器模式(InterpreterPattern)是一种按照规定语法进行解析的方案,在现在项目中使用较少,其定义如下:Givenalanguage,definearepresentationforitsgrammaralongwithaninterpreterthatusestherepresentationtointerpretsentencesinthelanguage。优......
  • 设计模式—门面模式
    门面模式门面模式(FacadePattern)也叫做外观模式,是一种比较常用的封装模式。要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。优点减少系统的相互依赖;提高了灵活性;提高安全性。缺点是不符合......
  • 设计模式—原型模式
    原型模式原型模式(PrototypePattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。优点原型模式是在内存二进制流的拷贝,要比直接new一个对象性......
  • 设计模式—工厂模式
    目录简单工厂模式类图案例分析工厂方法模式优点类图案例分析抽象工厂模式优点缺点使用场景注意事项类图案例分析工厂模式分为简单工厂模式,工厂方法模式,抽象工厂模式。简单工厂模式简单工厂模式的核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离,降低系统的耦合度......
  • vs c#判断程序是否调试模式,开发模式,发布模式,Debug模式,Release模式
    转发自:https://blog.csdn.net/qq_37664403/article/details/1187471951.Debug模式,Release模式#ifDEBUGConsole.WriteLine(“Debug模式”);#elseConsole.WriteLine(“Release模式”);#endif此方法适合习惯好的程序员,但是对我来说不怎么习惯使用,因为调试个代码,和不在调试情况下运......
  • Java开发笔记之mac的intellij idea在debug模式下卡住的问题
    0x00问题描述mac的Intellijidea在debug模式下放行时,程序会卡住无响应;即使在已经放行的情况下,后续代码也不运行,console内只显示Theapplicationisrunning或者等了很久程序才开始后续的运行。 0x01解决方案修改host中的配置。通过以下命令,打开hosts的编辑页面。sudovi......
  • 非关语言: 设计模式
    http://www.riabook.cn/doc/designpattern/非关语言:设计模式程式设计是思维具体化的一种方式,是思考如何解决问题的过程,设计模式是在解决问题的过程中,一些良好思路的经验集成,最早讲设计模式,人们总会提到Gof 的著作,它最早将经典的23种模式集合在一起说明,对后期学习程式设计,尤......
  • IMU模式下DML语句所产生的REDO RECORD格式解读
    总结:IMU模式下DML语句所产生的REDORECORD格式,是先有操作的changerector,再有向向UNDO段头的事务表写事务信息的changerector,再提交操作的changerector后,才进行把数据修改前值放到UNDO的changerector。注意:实验中INSERT和DELETE是先后做的,UPDATE操作是......
  • 深入解析Oracle IMU模式下的REDO格式
    1.什么是IMU?IMU的主要作用是什么,也就是说为了解决什么问题?IMU--->InMemoryUndo,10g新特性,数据库会在sharedpool开辟独立的内存区域用于存储Undo信息,每个新事务都会分配一个IMUbuffer(私有的),一个buffer里有很多node,一个node相当于一个block(回滚块)。IMU特性:IMU顾名思义就是在内......