• 设计模式 单例模式


    单例模式:保证一个类只有一个实例,并提供了一个全局的访问点。

    优点:

    1)单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,例如读取配置、产生其它依赖对象时,可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

    2)单例模式可以在系统设置全局的访问点,优化共享资源的访问,例如可以设计一个单例类,负责所有数据表的映射处理。

    常见的单例模式实现方式:

    主流:

    1)饿汉式(线程安全、调用效率高,但是不可以延时加载)

    2)懒汉式(线程安全,调用效率不高,但是可以延时加载)

    其它:

    1)双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题)

    2)静态内部类式(线程安全,调用效率高,而且可以延时加载)

    3)枚举单例(线程安全,调用效率高,但是不能延时加载)

    应用:windows的任务管理器、spring当中的每个Bean默认为单例的还有就是数据库的连接池的设计一般为单例的,数据库连接是一种数据库资源,网站的计数器一般也采取单例模式,方便同步,Servlet编程当中,每个Servlet也是单例的。

     实现代码:

    1)饿汉式:

    package com.Singleton;
    /**
     * 测试饿汉式的单例模式
     * @author Dell
     *
     */
    public class SingletonDemo01 {
    	/**
    	 * 类初始化时立即加载
    	 * 加载类时是天然的线程安全的
    	 */
    	private static SingletonDemo01 instance = new SingletonDemo01();	
    	private SingletonDemo01(){
    	}
    	//方法无需同步,调用效率高
    	public static SingletonDemo01 getInstance(){
    		return instance;
    	}
    }
    

    2)懒汉式:

    package com.Singleton;
    
    public class SingletonDemo02 {
    	//不在此进行实例化,延迟加载,真正使用时在进行加载
    	private static SingletonDemo02 instance;
    	//私有化构造器
    	private SingletonDemo02(){
    	}
    	//方法同步,调用效率低
    	public static synchronized SingletonDemo02 getInstance(){
    		if(instance==null){
    			instance = new SingletonDemo02();
    		}
    		return instance;
    	}
    }
    

    3)静态内部类

    package com.Singleton;
    /**
     * 静态内部类实现单例模式
     * 这种方式线程安全、调用效率高并实现了延时加载
     * @author Dell
     *
     */
    public class SingletonDemo03 {
    	private static class SingletonClassInstance{
    		private static final SingletonDemo03 instance = new SingletonDemo03();
    	}
    	
    	public static SingletonDemo03 getInstance(){
    		return SingletonClassInstance.instance;
    	}
    	
    	private SingletonDemo03(){
    	}
    }
    

    4)枚举单例模式

    package com.Singleton;
    /**
     * 避免了反射和反序列化的漏洞,效率高
     * 枚举方式没有延时加载的效果
     * @author Dell
     *
     */
    public enum SingletonDemo04 {
    	//这个枚举元素本身就是单例对象
    	instance;
    	
    	public void SingletonDemo04(){
    	}
    }
    

    测试类:

    package com.Singleton;
    
    public class Client {
    	public static void main(String[] args) {
    		SingletonDemo01 s1 = SingletonDemo01.getInstance();
    		SingletonDemo01 s2 = SingletonDemo01.getInstance();
    		System.out.println(s1);
    		System.out.println(s2);
    		
    		SingletonDemo02 s3 = SingletonDemo02.getInstance();
    		SingletonDemo02 s4 = SingletonDemo02.getInstance();
    		System.out.println(s3);
    		System.out.println(s4);
    		
    		SingletonDemo03 s5 = SingletonDemo03.getInstance();
    		SingletonDemo03 s6 = SingletonDemo03.getInstance();
    		System.out.println(s5);
    		System.out.println(s6);
    		
    		SingletonDemo04 s7 = SingletonDemo04.instance;
    		SingletonDemo04 s8 = SingletonDemo04.instance;
    		System.out.println(s7);
    		System.out.println(s8);
    		
    		
    	}
    }
    

     测试结果:

    态度决定高度,细节决定成败,
  • 相关阅读:
    程序员健康防猝指南4:常见医药疾病知识
    程序员健康防猝指南3:健康保健
    健康防猝指南1:体重和减肥的秘密
    程序员健康防猝指南5:运动基础入门
    健康防猝指南2:饮食健康
    程序员健康防猝指南6:[科学]运动
    websocket接口自动化集成pytest测试框架
    监控系统的建设思路,彻底找出性能瓶颈
    How to run Selenium Tests in Docker
    柠檬班性能测试11期 01
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/4797997.html
Copyright © 2020-2023  润新知