zoukankan      html  css  js  c++  java
  • 设计模式 单例模式

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

    优点:

    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);
    		
    		
    	}
    }
    

     测试结果:

    态度决定高度,细节决定成败,
  • 相关阅读:
    CSS自定义三角形
    完整例子-正则控制input的输入
    vux环境配置
    纯JS实现加载更多(VUE框架)
    随时监测屏幕大小,解决手机端小键盘遮挡输入框问题
    [转]Javascript中几种较为流行的继承方式
    使用字面量,比new更加有效
    2.ES6引进的新特性——类Class
    vue-router 基本使用
    插槽slot
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/4797997.html
Copyright © 2011-2022 走看看