单例模式
设计目的:想在系统中只能出现一个类的实例
特点:私有构造函数;类内部维护一个实例;生成一个静态获取实例的方法(延迟加载实例)
实现方式:双重检测方式;静态内部类方式;枚举类实现
双重检测方式
package com.commonCode.singleton; /** * Created by Demrystv. */ public class Singleton1 { //最原始版,采用双重检测 private Singleton1() { } private volatile static Singleton1 instance; public static Singleton1 getInstance() { //如果实力已经创建,则不进行下面的同步 if (instance == null){ //开始同步,防止不需要创建实例的线程进行同步,降低性能 synchronized (Singleton1.class){ //如果被同步的线程中,有一个线程创建了对象,那么别的线程就不用继续创建 if (instance == null){ instance = new Singleton1(); } } } return instance; } }
静态内部类
package com.commonCode.singleton; /** * Created by Demrystv. */ public class Singleton2 { //单例的实例被声明成static和final变量,在第一次加载类到内存中时就会初始化 //所以创建实例本身就是线程安全的 //SingletonHolder的存在又使得Singleton2具备延时加载的特点 private static class SingletonHolder{ private static final Singleton2 INSTANCE = new Singleton2(); } private Singleton2() { } public static final Singleton2 getInstance(){ return SingletonHolder.INSTANCE; } }
枚举类实现
package com.commonCode.singleton; /** * Created by Demrystv. */ public enum Singleton3 { //枚举类 INSTANCE; private String string = name(); public String getString() { return string; } public void setString(String string) { this.string = string; } public void test(){ System.out.println("开始测试"); } }