23种设计模式之单例模式

1 单例模式之Runtime类实现

单例模式是23种设计模式中比较简单的模式,应用非常广泛,例如在JDK中位于java.lang中的Rumtime类就是一个单例类。 Runtime类代表Java程序运行时的环境,每个Java程序都有一个与之对应的Runtime类,应用程序通过该对象与其运行时环境相连。应用程序不能创建自己的Runtime实例,但是可以通过getRuntime()方法获取与之相关联的Runtime对象。
这个就是Runtime类的单例模式实现

public class Runtime
{

/*私有静态化实例Runtime对象*/
  private static Runtime currentRuntime = new Runtime();

/*提供公共静态的获取Runtime实例的方法*/
  public static Runtime getRuntime()
  {
    return currentRuntime;
  }
  /*私有化构造器*/
  private Runtime() {}

单例类使用案例

package tony.javacore.designpattern.signleton;
import org.junit.Test;
import static tony.javacore.util.io.IOUtils.println;
/** * 单利类使用案例 * @author tony [email protected] * @file RuntimeHandler.java * @version 2016年2月6日下午6:45:24 * @since JDK7u80 */
public class RuntimeHandler {
     @Test
        public void testRuntimeInfo() throws Exception {
            /*Runtime是个单例类,不能通过new来获取对象的实例*/// Runtime runtime=new Runtime();

            //只能通过getRuntime()方法获取Runtime对象

            Runtime runTime =Runtime.getRuntime();
            //使用runTime运行记事本
        // runTime.exec("notepad.exe"); 

            runTime.exec("");
            println("JVM中剩余的内存数量:"+runTime.freeMemory());

            println("JVM中的总内存数量:"+runTime.totalMemory());

            println("JVM试图使用最大的内存数"+runTime.maxMemory());
        }

    }

}

2 单例模式的最佳实现

使用内部类的方式实现单例,既可以做到延迟加载,也不必使用同步关键字,是一种比较完善的实现。

package tony.javacore.designpattern.signleton;
import static tony.javacore.util.io.IOUtils.println;
/** * 单例模式最佳实现 * @author tony [email protected] * @file StaticSingleton.java * @version 2016年2月6日下午6:47:52 * @since JDK7u80 */
public class StaticSingleton {

    private StaticSingleton() {

        println(" executing new StaticSingleton()");
    }

    /** * * 使用内部类维护单例的实例,当StaticSingleton被加载时,内部类不会被初始化, * 故可确保当StaticSingleton类被载入JVM时,不会初始化单例类,而当getInstance()方法 * 被调用时,才会加载SingletonHolder,从而初始化instance. * 同时,由于实例的建立在类加载时完成,故天生对多线程友好,getInstance()方法不需要同步关键字 * @author Tony [email protected] * @since JDK7u80 * @version 2016年2月6日下午6:48:52 */
    private static class SingletonHolder {
        private static StaticSingleton instance = new StaticSingleton();
    }

    public static StaticSingleton getInstance() {
        return SingletonHolder.instance;
    }

    public static void main(String[] args) {

    }

}

3 单例模式的最佳实践

单例模式的优点
单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象(例如Hibernate框架中的SessionFactory)的产生需要比较多的资源时,如读取配置文件,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决(JavaEE通常使用Spring容器让对象长久驻留内存)。
单例模式可以避免对资源的多重占用,例如一个写文件的动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
单例模式的缺点:
单例模式一般没有接口,扩展很苦难,除了修改代码基本上没有第二种途径可以实现。
单例模式不利于测试,在并发环境中,如果单例模式没有完成,是不能进行测试的。
单例模式的使用场景:
在一个系统中,要求一个类有且只有一个对象,如果出现多个对象就会出现不良反应,可以采用单例模式。例如:
1.要求生成唯一对象的环境
2.在整个项目中需要一个共享访问呢点或者共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保存计数器的值,并确保是线程安全的。
3.创建一个对象需要消耗的资源过多,例如访问IO和数据库资源等。

你可能感兴趣的:(23种设计模式之单例模式)