java之单例设计模式

来源:互联网 发布:mac双系统怎么设置默认系统 编辑:程序博客网 时间:2024/05/16 11:37

单例模式解决的问题就是可以确保一个类在内存中的对象唯一性。

它可以实现数据共享,比如A程序需要用到一个配置文件,B程序也要用到一个配置文件,现在有个需求:A程序如果修改了这个配置文件,B程序需要知道更新过后的这个配置文件。这时候就要使用单例模式来确保配置文件的唯一性。

那么如何确保对象的唯一性?

1 不允许其他程序用new来创建该类的对象。

2 在该类中创建一个本来实例。

3 对外提供一个方法让其他程序可以获取对象。

那么如何实现?

1 私有化该类的构造函数。这样类外部无法访问构造函数进行创建对象。

2 通过new在本类中创建一个本类对象。

3 定义一个公有的方法,将创建的对象返回,提供给外部使用。

代码实现:

class Single{static Single sg = new Single();private Single(){} //外部不能创建Single对象,还要获取这个对象,那么获取的函数必须是static, //这样可以通过类名调用了。public static Single getInstance() {return sg; }//--------------------------------------------------private int num;  //单例里面的数据public void SetNum(int num){this.num = num;}public int GetNum(){return this.num;}//--------------------------------------------------}class SingleDemo{public static void main(String[] args){Single s = Single.getInstance(); //①Single s = Single.sg; //②  }}

代码分析:

1 既然②也可以访问单例对象,那么为什么还要用①这种形式来访问呢?

因为通过②这种方式访问单例,不如形式①通过函数访问可控,①的可控体现在可以在函数内部对sg进行相关处理,(比如取不到单例就返回null)

说白了①方式是函数调用,函数内部可以写更多的代码来控制着单例。所以一般推荐①方式来访问。

2 为了避免不安全的调用,我们习惯将单例改成private权限,即

static Single sg = new Single() ==>  private static Single sg = new Single()

接下来我们进一步修改:

class Single{private static Single sg = new Single(); //加了一个private限制 ③private Single(){}public static Single getInstance() {return sg; }}class SingleDemo{public static void main(String[] args){Single s1 = Single.getInstance(); Single s2 = Single.getInstance(); System.out.println(s1 == s2);  //结果为true}}

我们看到上面代码的③:

private static Single sg = new Single();//类一加载,对象就已经存在了,

如果我们延迟加载,在调用getInstance方法的时候再创建对象,我们需要修改一下代码如下:

//但是这种方式存在隐患,在多线程里面使用有时候会无法保证单例的唯一性。class Single{//类加载进来,没有对象,只有调用了getInstace方法时,才会创建对象。private static Single sg = null;  private Single(){}public static Single getInstance() {if(sg == null)a = new Single(); return sg; }}


注意:但是这种方式存在安全隐患,在多线程里面使用时候会无法保证单例的唯一性。




0 0