设计模式-单例模式

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 比如说某类A将构造方法私有化,这样就不能在类A以外的地方创建类A的实例了,是否创建类A的实例只能由类A本身决定。虽然外界不能直接创建类A的实例,但是类A提供了一个方法(getInstance()),该方法返回一个类A的对象,使得外界可以获取类A的实例来使用。 简单来说就是一个类被计划生育了(没开放二胎,只准生一个),计划生育保证了程序运行期间始终只存在一个该类的实例。 我们都学过鲁迅的孔乙己,孔乙己对鲁迅说:你知道茴香豆的茴有几种写法吗?。其实单例模式也是有好几种写法的,不同的写法有不同的特点,下面介绍几种单例模式的写法。 一、饿汉式 public class SingleMan { /** * 饿汉式,当类加载的时候就创建该类的唯一对象,并且只创建一次。 */ private final static SingleMan instance=new SingleMan(); /** * 构造方法私有化,防止外部类创建该类的对象。 */ private SingleMan(){} /** * 该类中获得该类对象的唯一方法 * @return instance */ public static SingleMan getInstance(){ return instance; } } 饿汉式,该方法利用了static关键字的属性,使得在该类加载的时候就创建该类的一个的实例。该方法保证了在程序运行期间只存在一个该类对象,也消除了并发的安全问题,缺点是在类加载时候就占用系统资源。 二、懒汉式 public class SinglePeople { //懒汉式,对象的创建推迟到getInstance方法 private final static SinglePeople peopleInstance=null; //构造方法私有化,外部类不能实例化该类 private SinglePeople(){} /** * 懒汉式,双重检查加锁 * @return peopleInstance; */ public static SinglePeople getInstance(){ //首先判断该实例是否存在,存在直接返回该类的对象 if(peopleInstance==null){ //使用synchronized保证线程安全 synchronized(SinglePeople.class){ //不存在创建实例 if(peopleInstance==null) peopleInstance=new SinglePeople(); } } return peopleInstance; } public void method1(){ System.out.println(“this is method1”); } public void method2(){ System.out.println(“this is method2”); } } getInstance方法保证了第一次调用被调用时创建它的实例。懒汉式中如果没有双重检查加锁的话,是线程不安全的,因为,如果当两个线程同时调用getInstance()方法并且此时peopleInstance此时为空,就有可能创建该类的多个对象。 三、使用静态内部类 public class SingleWomen { /** * 构造方法私有化 */ private SingleWomen(){} private static class SingleWomenHolder{ private static final SingleWomen instance=new SingleWomen(); } public static SingleWomen getInstance(){ return SingleWomenHolder.instance; } } 延迟加载,当调用getInstance方法时才初始化SingleWomen,并且返回SingleWomen的一个对象。

点赞