设计模式(二)——单例模式

本文属于系列文章《设计模式》,附上文集链接

单例模式定义

  • 确保对象在内存中有且只有一个,并自行实例化为系统提供这个实例。
  • 这个模式在我们只需要一个创建一个对象,避免重复创建对象的时候使用,比如说配置文件,工具类,缓存,线程池,日志对象等等
  • 单例模式属于创建类模式

实现方式一 饿汉模式

   //1.将构造函数私有化
    private SingleTon(){ }
    //2、内部调用构造函数创建对象,对象声明为私有属性
    // (饿汉模式的命名由此而来,因为SingleTon对象是static的,在加载SingleTon类的时候,instance对象就会被创建,无论有没有使用该对象,都会创建对象,就像饿汉去餐厅吃饭,无论吃不吃,先点了再说 )
    // final关键字确保该实例对象是内存中有且只有一个
    private final static SingleTon instance = new SingleTon();
    //3、提供方法获取singleTon实例
    public static SingleTon getInstance(){
        return instance;
    }

分析

将实例声明为static属性,在类被加载的时候就会创建实例,final属性确保了对象的唯一性。

实现方式二 懒汉模式

   //1.将构造函数私有化
    private SingleTon(){ }
    // 2.2、声明一个SingleTon对象,注意,是声明
    private static SingleTon instance = null;
     //3、提供方法获取singleTon实例
    public static SingleTon getInstance(){
        return instance;
    }

分析

这个一般叫做懒汉模式,因为是懒加载嘛,只有对象要被使用的时候才会实例化,但是这里就有一个问题了,假设在多线程的情况下,就会容易会创建多个实例,这不符合单例模式的定义,所以修改下

绝对安全的懒汉模式

   //1.将构造函数私有化
    private SingleTon(){ }
    // 2.2、声明一个SingleTon对象,注意,是声明
    private static SingleTon instance = null;
    // 3 在之前的基础上增加了synchronized关键字和一个instance判空
    public static synchronized SingleTon getInstance(){
        if(instance == null){
            Thread.sleep(1000);
            instance = new SingleTon();
        }
        return instance;
    }

单例模式扩展:指定数量的对象

哈哈,在书上看到的,虽然不知道能不能用上,但是当做活跃下思维吧,觉得挺好玩的。

// 单例类
public class Singleton {
    private Singleton(String name){
        nameList.add(name);
    }
    // 对象的最大个数
    private static int maxNumOfSingleton = 3;
    //定义对象列表
    private static ArrayList<Singleton> singletonList = new ArrayList<Singleton>();
    // 定义对象的名字列表,方便知道是哪个对象
    private static ArrayList<String > nameList = new ArrayList<>();
    //当前对象的序号
    private static int countNum;
    static{
        // 实例化
        for(int i = 1;i<=maxNumOfSingleton;i++){
            singletonList.add(new Singleton(i +"号对象"));
        }
    }
    public static Singleton getInstance(){
        countNum = new Random().nextInt(maxNumOfSingleton);
        return singletonList.get(countNum);
    }
    public void say(){
        System.out.println("我是"+nameList.get(countNum));
    }
}
// 场景
public class Client {
    public static void main(String[] args) {
        for(int i =0;i<5;i++){
            Singleton.getInstance().say();
        }
    }
}
结果:
我是3号对象
我是3号对象
我是1号对象
我是2号对象
我是1号对象

以上就是单例模式

    原文作者:l_sivan
    原文地址: https://www.jianshu.com/p/cc50525ed8bc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞