单例模式的目的
为了保证在一个进程中,某个类有且仅有一个实例。 因为这个类只有一个实例,因此,自然不能让调用方使用 new Xyz () 来创建实例了。 所以,单例的构造方法必须是 private ,这样就防止了调用方自己创建实例,但是在类的内部,是可以用一个静态字段来引用唯一创建的实例的: 那么问题来了,外部调用方如何获得这个唯一实例? 通过 public static 方法返回此唯一实例,使外部调用方能获取到实例。 Java标准库有一些类就是单例,例如 Runtime 这个类
一个类对外只提供一个对象!
a. 构造器私有化(不让外界new对象)
b. 在本类内实例化一个对象,然后让外界可以获取到
单例模式代码
1 public class Single { 2 // 方式一: 3 private static final Single SINGLE = new Single(); 4 private Single(){} 5 6 public static Single getSingle(){//该方法需要通过类名调用! 7 return SINGLE; 8 } 9 }
1 public class Single { 2 // 方式二: 3 public static final Single SINGLE = new Single(); 4 private Single(){} 5 }
1 public class Single { 2 // 方式三: 3 public static final Single SINGLE; 4 static { 5 SINGLE=new Single(); 6 } 7 private Single(){} 8 }
public class Single { //方式四:该方式存在一定的线程安全问题! private static Single SINGLE; private Single(){} public static Single getSingle(){//该方法需要通过类名调用! if(SINGLE==null) SINGLE=new Single(); return SINGLE; } }
① 懒汉式
方式四属于懒汉式
特点:只有你要的时候,我才给你准备对象
② 饿汉式
方式一二三属于饿汉式
特点:不管你要不要,类加载的时候,对象已经准备好