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
- java设计模式之单例设计
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- Linux 链接?软链接和硬链接区别?
- mysql查询今天、昨天、上周
- Android 自定义style
- SQL第十一章上机练习1
- 结合print讲解va_start和va_end使用
- java之单例设计模式
- Javaweb中JavaScript的流程控制语句
- TabActivity自定义底部导航栏
- 关于DHCP的经验总结
- HTML5基础
- chmod命令
- POJ3187——Backward Digit Sums(暴力)
- 分布式数据库中CAP原理和BASE
- MYSQL auto_increment字段重建