第二十二章Singleton和对象创建

本文详细介绍了Singleton模式的概念及其在软件工程中的应用。通过两种常见的实现方式,展示了如何确保一个类只有一个实例,并提供一个全局访问点。

第二十二章Singleton和对象创建

什么是Singleton呢?

In software engineering, the singleton pattern is a design pattern that is used to restrict instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. Sometimes it is generalized to systems that operate more efficiently when only one or a few objects exist. It is also considered an anti-pattern since it is often used as a euphemism for global variable.

http://en.wikipedia.org/wiki/Singleton_pattern

 

翻译:

     在软件工程领域,Singleton是一种将对象的实例限制为只有一个的一种模式。当系统的所有处理只需要某个对象的一个实例的时候可以适用这种模式。通常情况下,实例存在的越少(最好是一个)系统的性能越好。针对于Singleton的反模式是使用全局变量。

 

在wikipedia上Java的标准实现是:

public class Singleton
{
  // 通过私有化构造方法,防止在Singleton类之外构造类的实例。
  private Singleton() {}
 
  /**
   * SingletonHolder 在Singleton.getInstance()第一次调用的时候被初始化。
   */
  private static class SingletonHolder
  {
    private final static Singleton INSTANCE = new Singleton();
  }
 
  public static Singleton getInstance()
  {
    return SingletonHolder.INSTANCE;
  }
}

或者更常见的是:

 

public class Singleton {
   private final static Singleton INSTANCE = new Singleton();
 
   // 通过私有化构造方法,防止在Singleton类之外构造类的实例。
   private Singleton() {}
 
   public static Singleton getInstance() {
     return INSTANCE;
   }
 }

关于Singleton的说明

第一,必须保证在类的外部不能调用构造方法。

    在默认无构造方法的情况下,Java编译器会给类加上一个没有参数的共有的(Public)构造方法(默认构造方法),有构造方法的情况下Java编译器保留定义的构造方法。所以在使用Singleton的时候,如果有构造参数则需要将访问修饰符改为private的,没有构造参数的情况下,需要添加一个私有的默认构造方法。私有的默认构造方法参看上述代码。

 

   private Singleton() {}

 

第二,必须有一个类的实例

     为了避免在累得外面实例化类,所以在第一步中将构造参数设置为了私有,所以只能在类的内部实例化,参看上述代码。

     

   private final static Singleton INSTANCE = new Singleton();

第三,在类的外部必须能够访问到第二步中创建的实例。

     由于类不能被实例化,所以获取类内部的实例的方法必须为静态的。参看代码:

 

    public static Singleton getInstance() {
         return INSTANCE;
    }
    这个时候也明白了第二步中,INSTANCE实例为什么是static的了,final只是为了强调INSTANCE被初始化之后即不可改变,更见强调了singleton的含义。

 

关于Singleton的一些变化

如果一个Singleton类需要初始话怎么办呢?有两个方法

第一种方法,添加静态代码段

 

public class Singleton {
     private final static Singleton INSTANCE = new Singleton();
 

     static{

         // 在这里初始化Singleton的实例INSTANCE

     }


     // 通过私有化构造方法,防止在Singleton类之外构造类的实例。
     private Singleton() {}
 
     public static Singleton getInstance() {
       return INSTANCE;
     }
 }

第二种方法,在getInstance的时候初始化

public class Singleton {
   private static Singleton INSTANCE;
 
   // 通过私有化构造方法,防止在Singleton类之外构造类的实例。
   private Singleton() {}
 
   public static Singleton getInstance() {
        if(INSTANCE == null) {

             INSTANCE = new Singleton();

             //初始化代码

        }

     return INSTANCE;
   }
 }

 

另种方法采用的原则是,如果肯定会使用到这个实例,可以采用第一种方法;如果可能使用到这个实例,可以使用第二种方法。

Singleton初始化异常处理

 Singleton实例初始化的时候可能会出现一些异常,通常情况下可以不考虑,如果使用上述的第一种方法,实例化时发生在代码装载的时候,除了日志不可能给用户反馈。如果使用第二种方法,可以在用户调用的时候处理,可以在getInstance方法接口添加抛出异常便于用户处理。

所以如果Singleton初始化会抛出异常,且此类异常需要客户处理的时候需要使用上述的第二种方法。

 

资源下载链接为:https://pan.quark.cn/s/d9ef5828b597在 MATLAB 环境中处理 NetCDF(网络通用数据格式)文件是一种常见需求,尤其是在气候、环境科学以及天文学等领域。NetCDF 是一种用于存储多维数组数据的格式,因其良好的可扩展性跨平台兼容性,被广泛应用于存储天文观测数据、模拟结果等复杂信息。MATLAB 提供了对 NetCDF 文件的支持,方便用户读取、写入操作这些文件。压缩包中的文件大致包含以下内容:一是“nc 插件安装及数据读取.doc”,该文档可能详细介绍了在 MATLAB 中安装 NetCDF 插件及使用 MATLAB 函数读取 NetCDF 文件的步骤,包括安装过程、相关命令示例代码;二是“matlab - netcdf 插件安装 .nc 格式数据的读取.txt”,这可能是另一种格式的指南,以纯文本形式提供更简洁的说明或代码片段,便于用户快速查阅;三是“其他”,可能包含与 NetCDF 文件处理相关的辅助工具、示例或其他文档;四是“install files”,很可能是插件安装文件,用户需按文档指示运行这些文件以启用 MATLAB 中的 NetCDF 支持;五是“example”,可能包含示例 NetCDF 文件,供用户学习测试 MATLAB 的 NetCDF 读写功能。在 MATLAB 中处理 NetCDF 文件的步骤通常如下:首先,安装插件,因为 MATLAB 标准版本可能不自带 NetCDF 支持,需下载安装包并添加路径;其次,加载 NetCDF 库,通过netcdf命令实现;然后,用netcdf.open函数打开文件获取句柄;接着,用netcdf.getVar或netcdf.inqVar等函数读取数据,如data = netcdf.getVar(ncid, varID)可获取指定变量 ID 的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值