单例模式及其扩展
程序员文章站
2022-04-04 15:02:49
...
设计模式之禅学习——单例模式
1、单例模式应该是设计模式最简单的一种了,我认为,单例模式最基本的原理就是创建一个私有的构造函数,然后在该类中就生成一个该类的实例,并且通过一个静态方法返回该实例,那么当其他类应用该类时,使用的始终是一个该类的实例。
2、单例模式分为恶汉式和懒汉式。
3、恶汉式单例通用代码如下:
package com.wang.singletonPattern; /** * 恶汉式单例 * @author HeJW * */ public class Singleton1 { private static final Singleton1 singleton1 = new Singleton1(); private Singleton1(){ System.out.println("创建Singleton1实例"); } /* * 当其他类要使用该类是,通过调用该方法,得到该类的实例,并且得到的永远都是这一个 */ public static Singleton1 getSingleton1(){ return singleton1; } }
4、懒汉式单例代码如下:
package com.wang.singletonPattern; /** * 懒汉式单例 * @author HeJW * */ public class Singleton2 { private static Singleton2 singleton2 = null; private Singleton2(){ System.out.println("创建Singleton2实例"); } //如果不加synchronized关键字,线程不安全 public static synchronized Singleton2 getSingleton2(){ if( singleton2 == null ){ singleton2 = new Singleton2(); } return singleton2; } }
懒汉式单例记得要加synchronized关键字,如果不加synchronized关键字,线程不安全。如果一个A执行到
singleton2 = new Singleton2();
,但还没有获得对象(对象初始化是需要时间的),第二个线程B也在执行,执行到
singleton2 == null
判断,那么线程B得到的判断也为真,于是线程B也创建了一个实例,这样就导致两个线程创建了两个对象,所以线程不安全,只能加上synchronized关键字。
5、单例模式扩展,生成指定数量的实例,代码如下:
package com.wang.singletonPattern; import java.util.ArrayList; import java.util.Random; /** * 单例模式扩展,生成指定数量的实例 * @author HeJW * */ public class SingletonDevelop { //定义最多能生产两个实例 private static int maxNum = 2; //定义一个列表,容纳多有的实例 private static ArrayList<SingletonDevelop> singletonDeveloplist = new ArrayList<SingletonDevelop>(); //产生指定数量的实例对象 static{ for( int i=0; i<maxNum; i++ ){ singletonDeveloplist.add(new SingletonDevelop()); } } private SingletonDevelop(){ System.out.println("创建SingletonDevelop实例"); } //得到随机的SingletonDevelop实例 public static SingletonDevelop SingletonDevelop(){ Random randrom = new Random(); int singletonDevelopNum = randrom.nextInt(maxNum); return singletonDeveloplist.get(singletonDevelopNum); } }