单例模式详解:
单例顾名思义就是单个实例(即一个类只会生成唯一的一个对象)实例是怎样创建的呢?当然是调用构造器来创建对象的,但是外部类(比如测试类)每次创建都会生成一个对象,所以就只能将构造器用private修饰,这样就不会在外部类中随心所欲的产生多个对象了,内部类就能控制实例的数目,但是又产生了个问题,怎么创建对象?这个问题好解决,我们可以在内部类中定义一个可以提供一个实例的方法,但是又有问题出现了,既然构造器用private修饰,外部类不能生成对象,怎么调用内部类的方法?这个问题是个关键,既然不能用创建对象来解决,但是可以选择静态方法,静态方法可以用类名直接调用,这样就能得到单个实例;
单例示例一:
package com.zp.pattern.singleton; public class SingletonPattern { //创建一个实例对象,由于静态方法中只能调用静态变量,所以得定义成static; private static SingletonPattern singleton = new SingletonPattern(); //定义成private防止外部类创建多个实例; private SingletonPattern(){ } //由于构造方法定义成private类型,所以外部类只能通过静态方法调用内部类创建的实例; public static SingletonPattern getInstance(){ return singleton; } }
package com.zp.pattern.singleton; public class Test { public static void main(String[] args) { SingletonPattern singleton = SingletonPattern.getInstance(); SingletonPattern singleton2 = SingletonPattern.getInstance(); System.out.println(singleton == singleton2); } }
结果:true
单例示例二:(不适用于多线程)
package com.zp.pattern.singleton; public class SingletonPattern { //创建一个对象引用,由于静态方法中只能调用静态变量,所以得定义成static; private static SingletonPattern singleton; //定义成private防止外部类创建多个实例; private SingletonPattern(){ } //由于构造方法定义成private类型,所以外部类只能通过静态方法调用内部类创建的实例; public static SingletonPattern getInstance(){ if(singleton == null){ singleton = new SingletonPattern(); } return singleton; } }
package com.zp.pattern.singleton; public class Test { public static void main(String[] args) { SingletonPattern singleton = SingletonPattern.getInstance(); SingletonPattern singleton2 = SingletonPattern.getInstance(); System.out.println(singleton == singleton2); } }
结果:true