欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式-单例模式

程序员文章站 2022-05-03 22:43:04
前言: 设计模式是一个经常被提及的话题,无论是日常开发还是面试,都会经常被提及。让举出一些常用的设计模式,基本都会首先列举: 单例模式 工厂模式。我们这个设计模式系列,也不去追求新颖,我们也从提及率最高的单例模式开始。 使用场景:顾名思义,单例就是单实例的意思,是指在整个系统中,某个类的对象都只存在 ......

单例模式

简介

保证某一个类在内存中仅有一个实例

应用

Spring 中的 bean 全部是单例,一些常见的工厂类或管理类都是单例

代码

  1. 饿汉式,静态域初始化,在 JVM 加载的时候直接放到内存里,注意私有化构造方法使实例仅类本身可以创建

    public class Example01 {
    	private static final Example01 INSTANCE = new Example01();
    	
    	private Example01() {}
    	
    	public static Example01 instance() {
    		return INSTANCE;
    	}
    }
    
  2. 饿汉式,静态代码块初始化

    public class Example05 {
    	private static final Example05 INSTANCE;
    	
    	static{
    		INSTANCE = new Example05();
    	}
    	
    	private Example05() {}
    	
    	public static Example05 instance() {
    		return INSTANCE;
    	}
    }
    
  3. 饿汉式,在需要用的时候才加载

    • 采用加锁的方式防止并发安全问题
    • 存在问题:每一次请求得到实例都需要加锁性能低下
    public class Example02 {
    	private static Example02 INSTANCE;
    	
    	private Example02() {}
    	
    	public static Example02 instance() {
    		synchronized (Object.class) {
    			if(INSTANCE == null) {
    				INSTANCE = new Example02();
    			}
    		}
    		return INSTANCE;
    	}
    }
    
  4. 饿汉式2.0,改进1.0性能低下的问题

    • 采用双重为null判断避免每一次进来都需要加锁
    public class Example03 {
        private static Example03 INSTANCE;
    
        private Example03() {}
    
        public static Example03 instance() {
            if(INSTANCE == null) {
                synchronized (Object.class) {
                    if(INSTANCE == null) {
                        INSTANCE = new Example03();
                    }
                }
            }
            return INSTANCE;
        }
    }
    
  5. 静态内部类方式

    • 静态内部类的域及代码块只有在被调用时才会被加载,可以间接实现懒加载
    public class Example04 {
    	
    	
    	private Example04() {}
    	
    	public static class Provider{
    		private static Example04 INSTANCE = new Example04() ;
    	}
    	
    	public static Example04 instance() {
    		return Example04.Provider.INSTANCE;
    	}
    	
    }
    
  6. 枚举,由 Java 虚拟机保证单例

    public enum Example06 {
    	SINGLE
    }
    

来源

马士兵设计模式

本文地址:https://blog.csdn.net/weixin_45088998/article/details/112644975

相关标签: 设计模式 java