设计模式之单例模式
什么是单例模式?
单例模式,保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
如何实现?
懒汉式单例:
将构造函数设置为private,同时设置一个getInstance()用来获取实例。
懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间
Singleton.java

1 package singleton01; 2 3 public class Singleton { 4 private static Singleton singleton; 5 private Singleton(){ 6 7 } 8 9 public static Singleton getInstance() { 10 if (singleton == null) { 11 singleton= new Singleton(); 12 } 13 return singleton; 14 } 15 }
Main.java 测试类

1 package singleton01; 2 3 public class Main { 4 public static void main(String[] args) { 5 Singleton singleton=Singleton.getInstance(); 6 Singleton singleton2=Singleton.getInstance(); 7 System.out.println(singleton==singleton2); 8 9 } 10 }
但是以上并未考虑到线程安全的问题,线程不安全。需将其进行同步操作。
同步情况代码如下:

1 package per.zww.design; 2 3 /** 4 * 懒汉型单例模式 5 * 6 * @author zhaoww 7 * 8 */ 9 public class Singleton { 10 private static Singleton singleton=null; 11 private Singleton(){ 12 } 13 14 public static Singleton getinstance() { 15 // TODO Auto-generated method stub 16 if (singleton==null) { 17 synchronized (Singleton.class) { 18 if (singleton == null) { 19 singleton=new Singleton(); 20 } 21 } 22 } 23 return singleton; 24 } 25 }
饿汉式单例:
饿汉式单例类 在类初始化时,已经自行实例。
饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。
Singleton1.java

1 public class Singleton1 { 2 3 private Singleton1() {} 4 5 private static final Singleton1 single = new Singleton1(); 6 7 public static Singleton1 getInstance() { 8 return single; 9 } 10 }
登记式单例:未使用
初学《大话设计模式》