深入理解Java的单例模式

下面是一个单例模式的实现
public class Station {
   
    private static Station st=new Station();
    private int num=10;
    private Station(){
       
    }
   
    public static Station getInstance(){
        return st;
    }
   
    public void sell(){
        if (st.num>0) {
            num--;
            System.out.println("有票");
        }else {
            System.out.println("票卖没了");
        }
    }
}


public class Demo {

    public static void main(String[] args) {

        Station st=Station.getInstance();
        for (int i = 20; i >0; i--) {
            System.out.print(i+"\t");
            Station.getInstance().sell();
        }
       
    }
}

  单例模式可以理解为是面向对象语言中对全局变量的一种实现,当然的作用不仅仅限于此。我们可以对单例模式实现的过程中的思路进行一下剖析,如此更加清楚的认识到设计模式究竟是什么,当然也可以证明一下基础知识的重要性(基础才是王道)。

  首先我们分析一下单例的意义,在Java中为一个类只能有一个实例化对象。这显然不是我们平常所写的一个普通类所能够做到的事情。那么为了实现这一个要求该如何去做呢。实例化是一个类的初始化时候的问题,而初始化是构造方法去做的事情(当然这里面jvm也帮我们做了很多的事情)。构造方法,我们要设为私有。这样我们让该类不能被随意的初始化,那该在哪初始化,而它有怎样被调用呢。

  一个不能初始化的类,也就是说不能够被实例化的类,我们想要调用。那么无疑让我们想到了static关键字,一个public static 的方法可以实现我们这个要求——即在不实例化类的情况下能够调用其中的方法。于是我们写下了一个public static 的方法,用于得到这个类的唯一实例。而这个实例我们是在类的内部实例,并同样定义为 static 的变量(一直用static 只是为了能够不实例化便可以使用。因为static可以在类初始化的时候便生成了,对于此不理解的同学们可以查看我的前一篇博客。。。)。到这里我们一个单例模式的实现框架其实已经搭好了。

  本文中的例子,sell()方法的使用是为了解决一个具体问题,我在单例框架下扩展而得到的。该例子的背景是有一个售票点,我们要知道自己买票的时候是否能够买到票。显然这是一个可以用单例模式解决的问题。因为全局只能有一个记录票数的变量,因此我们不能够造出多个实例,那样便失去了原有的意义。于是,我们在此加上了机票数的变量num,并假使只剩下十张票。

  然后,我们设立一个售票的方法,如果有票卖便打印出有票同时票的数量减一,否则打印出票卖没了。(简单的判断语句)

原文地址:https://www.cnblogs.com/yxnchinahlj/p/1836084.html