• Java设计模式(二)-单例模式


    单例模式建议保证某个对象仅仅仅仅有一个实例,当仅仅有一个对象来协调整个系统的操作时,在计算机系统中。线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

        以下是单例模式的类图:包含的private和static修饰的实例instance、一个private的构造函数、一个static的getInstance函数

      单例模式主要有三种:懒汉式单例、饿汉式单例、登记式单例三种

    1、饿汉式单例:在类的初始化时候,自行创建了实例

    class Singleton1{	
    	public Singleton1() {};
    	//自行实例化
    	static private final Singleton1 instance = new Singleton1();
    	//获取唯一实例
    	public static Singleton1 getInstance(){
    		return instance;
    	}
    }

      2、懒汉式单例:在真正须要的时候在创建唯一实例

    //线程安全之中的一个
    class Singleton3{	
    	public Singleton3() {};
    	static private Singleton3 instance = null;
    	//获取唯一实例
    	public static synchronized Singleton3 getInstance(){
    		if(null == instance){
    			return new Singleton3();
    		}
    		return instance;
    	}
    }

    3、登记式单例:相似Spring,通过名字匹配获取唯一实例

    class Singleton4{	
    	public Singleton4() {};
    	static private Map<String, Singleton4> map = new HashMap<String,Singleton4>();
    	static{
    		Singleton4 single = new Singleton4();
    		map.put(single.getClass().getName(), single);
    	}
    	//依据名字获取唯一实例
    	public static synchronized Singleton4 getInstance(String name){
    		if(null == name){
    			name = Singleton4.class.getName();
    			System.out.println("name == null"+"--->name="+name);
    		}
    		if(null == map.get(name)){
    			try {
    				map.put(name, (Singleton4)Class.forName(Singleton4.class.getName()).newInstance());
    			} catch (InstantiationException e) {
    				e.printStackTrace();
    			} catch (IllegalAccessException e) {
    				e.printStackTrace();
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			}
    		}
    		return map.get(name);
    	}
    	public String about() {    
    		   return "Hello, I am RegSingleton.";    
    	} 
    }
    main函数:

    public class MySingleton {
    	public static void main(String[] args) {
    		Singleton4 single4 = Singleton4.getInstance(null);
    		Singleton4 single5 = Singleton4.getInstance(null);
    		Singleton4 single6 = Singleton4.getInstance("aaa");
    		Singleton4 single7 = Singleton4.getInstance("bbb");	
    		if(single4 == single5){ 
    			System.out.println("single4和single5是同一个实例");
    		}else{
    			System.out.println("single4和single5不是同一个实例");
    		}
    		if(single6 == single7){ 
    			System.out.println("single46和single7是同一个实例");
    		}else{
    			System.out.println("single6和single7不是同一个实例");
    		}
    	}
    输出结果:
    name == null--->name=com.Singleton4
    name == null--->name=com.Singleton4
    single4和single5是同一个实例
    single6和single7不是同一个实例


  • 相关阅读:
    hbase 学习笔记一---基本概念
    hdu 4496 (并差集)
    rqnoj-105-核电站问题-dp
    面试之BI-SQL--table转换
    Android:从程序员到架构师之路Ⅲ_高焕堂
    Linux 的进程组、会话、守护进程
    Oracle创建dblink报错:ORA-01017、ORA-02063解决
    JSP 指令
    JSP 生命周期
    JSP 结构
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/8384463.html
Copyright © 2020-2023  润新知