所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 写法主要分为四大类:饿汉式,懒汉式,静态内部类,枚举 下面一个一个进行展示:
1.饿汉式:在类被加载的时候,即生成了一个单例对象,缺点是没有实现懒加载,可能造成内存浪费。 //1.直接在创造时赋值 class Luzelong{ private Luzelong(){} private static Luzelong lzl = new Luzelong(); public static Luzelong getInstance(){ return lzl; } } 2.静态代码块: class Luzelong{ private Luzelong(){} private static Luzelong lzl; static{ lzl = new Luzelong(); } public static Luzelong getInstance(){ return lzl; } } 2.懒汉式:解决了恶汉式没有考虑到的懒加载问题。方法一是线程不安全的,在多线程的环境下,极有可能创建多个对象。方法二虽然是线程安全的,但加上synchronized这种重量级的锁是非常消耗性能的,实际开发用的也不多。这里强力推荐方法三,不仅线程安全,而且不怎么影响性能。 //1.线程不安全的写法 class Luzelong{ private Luzelong(){} private static Luzelong lzl; public static Luzelong getInstance(){ if(lzl == null){ lzl = new Luzelong(); } return lzl; } } //2.通过加锁(synchronized)实现线程安全 class Luzelong{ private Luzelong(){} private static Luzelong lzl; public static synchronized Luzelong getInstance(){ if(lzl == null){ lzl = new Luzelong(); } return lzl; } } //3.双重检测写法 class Luzelong{ private Luzelong(){} private static volatile Luzelong lzl;//注意加了volatile关键字 public static Luzelong getInstance(){ if(lzl == null){ synchronized (Luzelong.class){ if(lzl == null){ lzl = new Luzelong(); } } } return lzl; } } 3.静态内部类:静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时也能访问它。静态内部类有个特点–在外层类被加载的时候并不会也跟着被加载,只有在用到该内部类时才会被加载(懒加载)。所以实际开发也比较推荐这种写法。 class Luzelong{ private Luzelong(){} private static class LuzelongInstance { private static final Luzelong lzl = new Luzelong(); } public static Luzelong getInstance(){ return LuzelongInstance.lzl ; } } 4.枚举:枚举的一个重要特点就是枚举对象是唯一的,天然的单例模式。实际开发也非常推荐! enum Luzelong{ lzl ... }