单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。这种模式涉及到一个单一的类,该类负责建立本身的对象,同时确保只有单个对象被建立。这个类提供了一种访问其惟一的对象的方式,能够直接访问,不须要实例化该类的对象。数据库
单例模式5种建立方式:windows
实现代码以下:设计模式
//饿汉式 public class SingletonDemo01 { // 类初始化时,会当即加载该对象,线程天生安全,调用效率高 private static SingletonDemo01 singletonDemo01 = new SingletonDemo01(); private SingletonDemo01() { System.out.println("SingletonDemo01初始化"); } public static SingletonDemo01 getInstance() { System.out.println("getInstance"); return singletonDemo01; } public static void main(String[] args) { SingletonDemo01 s1 = SingletonDemo01.getInstance(); SingletonDemo01 s2 = SingletonDemo01.getInstance(); System.out.println(s1 == s2);//结果为ture } }
//懒汉式 public class SingletonDemo02 { //类初始化时,不会初始化该对象,真正须要使用的时候才会建立该对。 private static SingletonDemo02 singletonDemo02; private SingletonDemo02() { } public synchronized static SingletonDemo02 getInstance() { if (singletonDemo02 == null) { singletonDemo02 = new SingletonDemo02(); } return singletonDemo02; } public static void main(String[] args) { SingletonDemo02 s1 = SingletonDemo02.getInstance(); SingletonDemo02 s2 = SingletonDemo02.getInstance(); System.out.println(s1 == s2);//结果为true } }
//静态内部类方式 public class SingletonDemo03 { private SingletonDemo03() { System.out.println("初始化.."); } public static class SingletonClassInstance { private static final SingletonDemo03 singletonDemo03 = new SingletonDemo03(); } // 方法没有同步 public static SingletonDemo03 getInstance() { System.out.println("getInstance"); return SingletonClassInstance.singletonDemo03; } public static void main(String[] args) { SingletonDemo03 s1 = SingletonDemo03.getInstance(); SingletonDemo03 s2 = SingletonDemo03.getInstance(); System.out.println(s1 == s2);//结果为true } }
//优点:兼顾了懒汉模式的内存优化(使用时才初始化)以及饿汉模式的安全性(不会被反射入侵)。
//劣势:须要两个类去作到这一点,虽然不会建立静态内部类的对象,可是其 Class 对象仍是会被建立,并且是属于永久带的对象。
//枚举单例式 public class User { public static User getInstance() { return SingletonDemo04.INSTANCE.getInstance(); } private static enum SingletonDemo04 { INSTANCE; // 枚举元素为单例 private User user; private SingletonDemo04() { System.out.println("SingletonDemo04"); user = new User(); } public User getInstance() { return user; } } public static void main(String[] args) { User u1 = User.getInstance(); User u2 = User.getInstance(); System.out.println(u1 == u2);//结果为true } }
//双重检测方式 public class SingletonDemo04 { private SingletonDemo04 singletonDemo04; private SingletonDemo04() { } public SingletonDemo04 getInstance() { if (singletonDemo04 == null) { synchronized (this) { if (singletonDemo04 == null) { singletonDemo04 = new SingletonDemo04(); } } } return singletonDemo04; } }
优势: 安全
缺点: 多线程
注意事项:工具
应用场景:
单例模式只容许建立一个对象,所以节省内存,加快对象访问速度,所以对象须要被公用的场合适合使用。性能
举例: 优化