查看: 2083|回复: 0

[ASP.NET教程] java 单例模式(饿汉模式与懒汉模式)

发表于 2018-1-14 11:37:25

java 单例模式

饿汉式单例

对于饿汉模式,我们可这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。

懒汉式单例类

对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。

单例设计模式常用于JDBC链接数据库

注意:

1 我们常用的是第一种饿汉式,因为:

(1)既然采用了单例设计模式,就是为了使用单例类的对象,所以就先把他实例化出来.

(2)在懒汉式中存在一定的安全隐患,需要加上同步关键字synchronized,否则就谈不上单例了,但是加上了synchronized效率就稍逊了

2 在第一种办法中,代码private static final Single SINGLE=new Single();为什么有final呢?

因为被final关键字修饰的类,不能被继承,被final修饰的成员变量不可以被修改.

此处用了final为了强化和重点突出:"同一对象"这个概念——只有这么一个对象,而且它是不可以被修改的.

如果不用final修饰 Single SINGLE那么就会有这么一种情况:业务很复杂,在不经意间就修改了此对象,造成各种错误.

第一种(饿汉式):

思路:

(1)不让其他类建立该类的对象.即将构造函数设置为私有!
(2)自定义一个本类对象
(3)将自定义的对象提供出去.即定义一个get方法,返回值为此类的对象。

分析:

第一步:将单例类中构造函数私有化了且利用一个get()函数向外提供此类的对象,所以其他类无法构造此类的对象。
第二步:但其他类要想调用此单例类里的方法,于是只有采用内名.方法名()来实现,这就要求这个方法必须是静态static的。
第三步:又因为静态方法只能访问静态成员!所以要将SINGLE设置为静态的

  1. public class SingleDemo {
  2. public static void main(String[] args) {
  3. Single s1=Single.getSingle();
  4. s1.setNumber(44);
  5. Single s2=Single.getSingle();
  6. s2.setNumber(55);
  7. System.out.println("s1.number="+s1.number);
  8. System.out.println("s2.number="+s2.number);
  9. if(s1.equals(s2)){
  10. System.out.println("s1与s2是同一对象即:s1==s2");//if条件成立
  11. }
  12. }
  13. }
  14. class Single{
  15. int number;
  16. public int getNumber() {
  17. return number;
  18. }
  19. public void setNumber(int number) {
  20. this.number = number;
  21. }
  22. private Single(){};//第一步
  23. private static final Single SINGLE=new Single();//第三步
  24. public static Single getSingle(){//第一步和第二步
  25. return SINGLE;
  26. }
  27. }
复制代码

第二种(懒汉式):

  1. package cn.com;
  2. public class SingleDemo2 {
  3. public static void main(String[] args) {
  4. Single s1=Single.getSingle();
  5. s1.setNumber(44);
  6. Single s2=Single.getSingle();
  7. s2.setNumber(55);
  8. System.out.println("s1.number="+s1.number);
  9. System.out.println("s2.number="+s2.number);
  10. if(s1.equals(s2)){
  11. System.out.println("s1与s2是同一对象即:s1==s2");//if条件成立
  12. }
  13. }
  14. }
  15. class Single{
  16. int number;
  17. public int getNumber() {
  18. return number;
  19. }
  20. public void setNumber(int number) {
  21. this.number = number;
  22. }
  23. private Single(){};
  24. private static Single SINGLE=null;
  25. public static synchronized Single getSingle(){//多线程时加上synchronized是关键!!!
  26. if(SINGLE==null){
  27. SINGLE=new Single();
  28. return SINGLE;
  29. }
  30. else{
  31. return SINGLE;
  32. }
  33. }
  34. }
复制代码

以上就是对java 单例设计模式的详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!



回复

使用道具 举报