java单例模式的写法

单例模式指的是在内存中只有一个对象 ,这样咱们想到实现单例模式应该用到static关键字多线程

一  懒汉式单例函数

先看下面这个类测试

//懒汉式单例类(我是没明白这个命名是怎么来的 与后面的饿汉式单例 的区别是 实例域初始化的时间)
public class Singleton {
      //私有构造方法  通常构造方法都是public 私有说明不能在这个类的外部实例化这个类  
	  private Singleton(){}
	  private static Singleton single=null;  
	    //静态工厂方法   
	  public static Singleton getInstance(){  
	         if (single == null) {    
	             single = new Singleton();  
	         }    
	        return single;  
	  }   
	  public static void main(String args[])  
	  {  
	        Singleton instance = Singleton.getInstance();  
	        Singleton instance2 = Singleton.getInstance();
	        System.out.println(instance == instance2);
	      
	  }  
	    
}

 首先看到这个类的结构 线程

 这个类只有一个域 这个域是引用类型 这个域被static 修饰 会在类编译的时候就加载 只不过这个时候是nullcode

 有两个静态方法 另一个main方法是我测试用的对象

  打印出的结果是true 说明两个对象是同一个对象内存

private Singleton() {};
 
 构造函数 跟类名相同的方法是构造函数 构造函数是用来构造一个类的
 构造函数通常是public 能够在类外调用
 这里变成private 就能够防止在另一个类里面用new的方式建立了

 咱们能够试试在另一个类里吗调用这个构造函数
 public static void main(String[] args) {
		// TODO Auto-generated method stub
       Singleton singleton = new Singleton();
      
}
编译是报错的

咱们经过 类名.方法 的方式调用静态类开发

Singleton.getInstance();
若是实例域是null(第一个调用这个方法)则建立实例域(经过私有构造函数)

2、饿汉式单例get

public  class Singleton {
	  private Singleton() {}  
	  private static final Singleton single = new Singleton();  
	    //静态工厂方法   
	  public static Singleton getInstance() {  
	        return single;  
	  }    
	  public static void main(String args[])  
	  {  
        Singleton instance = Singleton.getInstance();  
	    Singleton instance2 = Singleton.getInstance();
	    System.out.println(instance == instance2);
	  }  
	    
}

与上面的懒汉式区别是静态实例域一开始就构造出来了 而懒汉式开始加载的时候是null编译

也就是饿汉式每次调用时都是同一个对象 类编译的时候就经过new Singleton() 的方式构造出来 并且在后面不可改变

三 静态内部类方式

public class Singleton {
    private Singleton() {//构造函数
	}
    private static  class innerClass{ //静态内部类 编译后就成了一个单独的类 Singleton$innerClass 
    	public static final  Singleton instance = new Singleton() ;
    }
    public static final Singleton getinstance(){
    	return innerClass.instance;	
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton instance = Singleton.getinstance();
		Singleton instance1 = Singleton.getinstance();
		System.out.println(instance == instance1);
	}

}

调用单例的方法一样是 类名.方法 经过内部类的方式调用就是 单例类一开始就构造出来了这跟饿汉式是同样的 只不过是在内部类中构造的 。

这三个例子都只是实现了单例模式的基本结构  在实际开发中咱们应当在构造函数中实现更多的方法。

另外 网上有不少关于多线程与单例的讨论 我只知道第2、三种方法构造出来的单例对象在程序中是不能从新改变赋值的 

有朋友了解这方面的问题的能够说下哈

相关文章
相关标签/搜索