Java中如何创建单例类(Singleton)

大部分时候都把类的构造器定义为public,允许任何类自由的创建该类的对象。但在某些时候,允许其他类自由创建的对象没有意义,还有可能造成系统的性能下降(因为频繁的创建对象、回收对象带来的系统开销问题)。

如果一个类始终只能创建一个实例,则这个类被称为单例类。

在一些特殊的场合下,要求不予许资自由创建该类的对象,而只允许为该类创建一个对象。为了避免其他类自由的创建该类的实例,应该吧该类的构造器使用private修饰,从而把该类的所有的构造器隐藏起来。

根据良好的封装原则:一旦该类的构造器被隐藏起来,就需要提供一个public方法作为该类的访问点,用于创建该类的对象,且该方法必须使用static修饰(因为调用该方法之前还不存在对象,因此调用该方法的不可能是对象,只能是类)。

除此之外,该类还必须缓存已经创建好的类,否则该类复发知道是否已经创建过对象,也就无法保证只创建一个对象。我们需要使用一个成员变量来保存曾经创建好的对象,因为该成员变量需要被上面的静态方法访问,故也必须使用static修饰。

Singleton类:

public class Singleton {
    // 使用一个变量来缓存已经创建的实例
    private static Singleton instance;
    // 对构造器使用private修饰 隐藏构造器
    private Singleton(){}
    // 提供一个静态方法  返回Singleton实例
    public static Singleton getInstance(){
        // 如果为null 表明还没有创建Singleton对象
        if (instance == null) {
            // 创建对象
            instance = new Singleton();
        }
        
        return instance;
    }   
}

测试类:

public class SingletonTest {
    public static void main(String[] args) {
        // 创建Singleton对象不能通过构造器
        // 只能通过getInstance方法得到实例
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);  // 输出 true
    }
}

正式通过上面的getInstance方法提供的自定义的控制(这也是封装的优势:不允许自由的访问的成员变量和实现的细节),保证Singleton类只能产生一个实例。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,597评论 18 399
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,622评论 1 8
  • 1、面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标...
    michaelgong阅读 912评论 0 1
  • 寒冬夜阴雨绵绵,异乡人思绪万千。走走停停,又过了一个春夏秋冬。这一刻,在书桌前,我突然就温柔的像只猫,一切都很...
    一只爱笑的兔子阅读 327评论 0 1
  • 紫禁城是封建王权最重要的象征之一,封建社会最高的统治机构就坐落在里面,为了维护统治,紫禁城的建设者在修建这座“城”...
    0034fcf3e721阅读 525评论 3 2

友情链接更多精彩内容