设计模式一:单例模式(续)

转载于:http://www.16boke.com

虽然单例模式很简单,但是如果以性能来考虑是否通用的单例模式性能就是最优的吗?答案是并不是最优的。如果在单例类中有其它静态方法,程序如果只调用其它静态方法但不要实例化单例类,这样该如何处理?

package com.orm.singleton;
/**
 * 单例模式
 * 定义私有的类变量,定义公有的访问方法进行实例化
 * @author admin
 *
 */
public class Singleton1 {
	private static Singleton1 singleton = new Singleton1();
	
	private Singleton1(){
		System.out.println("构造函数初始化...");
	}
	
	public static Singleton1 getInstance(){
		return singleton;
	}
	/**
	 * 当通过Singleton1.test()来调用此方法的时候还需要实例化Singleton1对象,浪费内存空间
	 */
	public static void test(){
		System.out.println("测试方法...");
	}
}

package com.orm.singleton;
/**
 * 单例模式
 * 定义静态类变量但不实例化
 * @author admin
 *
 */
public class Singleton2 {
	private static Singleton2 singleton = null;
	
	private Singleton2(){
		System.out.println("构造函数...");
	}
	
	public static synchronized Singleton2 getInstance(){
		if(singleton == null)
			singleton = new Singleton2();
		return singleton;
	}
	
	/**
	 * 当通过Singleton2.test()来调用此方法的时候虽然不需要实例化Singleton2对象,
	 * 但是使用synchronized来同步实例化Singleton2对象在并发环境下性能会受影响
	 */
	public static void test(){
		System.out.println("测试方法...");
	}
}

package com.orm.singleton;
/**
 * 单例模式
 * 使用内部类来实例代对象
 * @author admin
 *
 */
public class Singleton3 {
	private Singleton3(){
		System.out.println("构造函数...");
	}
	private static class SingletonHandler{
		private static Singleton3 singleton = new Singleton3();
	}
	public static Singleton3 getInstance(){
		return SingletonHandler.singleton;
	}
	/**
	 * 当通过Singleton3.test()来调用此方法的时候只会执行这个方法, 不用实例化Singleton3对象,性能也不会有影响
	 */
	public static void test(){
		System.out.println("测试方法...");
	}

}

package com.orm.singleton;

public class Test {
	public static void main(String[] args) {
		System.out.println("Singleton1===========");
		Singleton1.test();
		System.out.println("Singleton2===========");
		Singleton2.test();
		System.out.println("Singleton3===========");
		Singleton3.test();
	}
}

经过分析最后一种采用内部类来实现单例的方式是性能最优的,但是如果对是否实例化单例类不在间,则可以选择第一种也就是目前最通用的方式,建议不要采用第二种方式。


转载于:http://www.16boke.com

你可能感兴趣的:(设计模式,单例模式,性能)