单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式Demo:
/** * 2018年4月4日下午8:53:13 */ package com.Designpattern; /** * @author xinwenfeng * */ public class TestSingleton { /** * @param args */ public static void main(String[] args) { System.out.println("===========1============"); MySingleton1 singleton1 = MySingleton1.getSingleton(); System.out.println(singleton1); MySingleton1 _singleton1 = MySingleton1.getSingleton(); System.out.println(_singleton1); System.out.println("===========2============"); MySingleton2 singleton2 = MySingleton2.getSingleton(); System.out.println(singleton2); MySingleton2 _singleton2 = MySingleton2.getSingleton(); System.out.println(_singleton2); System.out.println("===========3============"); MySingleton3 singleton3 = MySingleton3.getSingleton(); System.out.println(singleton3); MySingleton3 _singleton3 = MySingleton3.getSingleton(); System.out.println(_singleton3); System.out.println("===========4============"); MySingleton4 singleton4 = MySingleton4.getSingleton(); System.out.println(singleton4); MySingleton4 _singleton4 = MySingleton4.getSingleton(); System.out.println(_singleton4); System.out.println("===========5============"); MySingleton5 singleton5 = MySingleton5.getSingleton(); System.out.println(singleton5); MySingleton5 _singleton5 = MySingleton5.getSingleton(); System.out.println(_singleton5); System.out.println("===========6============"); MySingleton6 singleton6 = MySingleton6.SINGLETON; singleton6.show(); } } //懒汉式,线程不安全 class MySingleton1{ private MySingleton1() {System.out.println("构造一个1");};//私有构造方法 private static MySingleton1 singleton; public static MySingleton1 getSingleton() { if(null == singleton) { singleton = new MySingleton1(); } return singleton; } } //懒汉式,线程安全 class MySingleton2{ private MySingleton2() {System.out.println("构造一个2");};//私有构造方法 private static MySingleton2 singleton; public synchronized static MySingleton2 getSingleton() {//每次都锁,效率低 if(null == singleton) { singleton = new MySingleton2(); } return singleton; } } //双重检查锁,线程安全 class MySingleton3{ private MySingleton3() {System.out.println("构造一个3");};//私有构造方法 private static MySingleton3 singleton; public static MySingleton3 getSingleton() { if(null == singleton) { synchronized (MySingleton3.class) {//只有为null的时候才锁,效率提高 if(null == singleton) { singleton = new MySingleton3(); } } } return singleton; } } //饿汉式,线程安全 class MySingleton4{ private MySingleton4() {System.out.println("构造一个4");};//私有构造方法 private static MySingleton4 singleton = new MySingleton4();//加载类时就创建 public synchronized static MySingleton4 getSingleton() { return singleton; } } //静态内部类 class MySingleton5{ private MySingleton5() {System.out.println("构造一个5");};//私有构造方法 private static class SingletonInner{ private static MySingleton5 singleton = new MySingleton5(); } public synchronized static MySingleton5 getSingleton() { return SingletonInner.singleton;//调用时才创建,懒加载 } } //枚举类(最优) enum MySingleton6{ SINGLETON; public void show() { System.out.println("枚举最好用的单例模式"); }; }
结果: