单例模式指的是在内存中只有一个对象 ,这样咱们想到实现单例模式应该用到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、三种方法构造出来的单例对象在程序中是不能从新改变赋值的
有朋友了解这方面的问题的能够说下哈