<<单例设计模式>>--黑马程序员

--------------------- ASP.Net+Android+IOS开发   .  .Net培训.-----------期待与您交流! -----------------

1.  设计模式的理解:

        解决某一类问题最行之有效的方法。

             这里有是:老外怎样向妻子介绍设计模式的:   请点击  有利于我们进一步的理解设计模式。下面就是几个简单的设计模式。

2.  单例设计模式。

        我的理解:单例就是一个对象或者说是有有限的对象,避免其他的程序可以过多的创建此对象,这样就可以操作特定的对象形成统一的现象。所有对象都共享同样的信息,就定义成单例模式。便于管理,安全。

      2-1.单例模式的实现步骤。

              1.将本类(Single)的构造方法私有化-----为了防止其他的类(Other)可以创建此类(Single)对象。

        2.在本类(Single)中实例化一个对象----为了可以操作本类的中的成员

        3.在本类中提供一个方法,返回在本类中实例化的对象----为了可以在其他类(Other)可以获得此对象,对本类进行操作。

     2-2.单例模式注意事项。

            将在本类中定义对象定义成静态的(static)-------因为在其他类中不是实例化本类(Single),所以必须通过类名调用获取本类的对象的方法,所以方法是静态的,因为静态方法只能调用静态成员,所以要将实例化的对象定义成静态的。

     2-3.单例模式:懒汉式和饿汉式。

           便于理解的记忆方法:饿汉式就是一个人非常饿,所以他进来就吃(就是先实例化),懒汉式就是一个人非常懒,那么他什么时候饿什么时候才做,才吃(就是后实例化,就是什么时候用到,什么时候实例化)

            1.饿汉式----模式代码

                  饿汉式就是先实例,只要是类一加载,那么次对象就存在。

public class Single {
  private static Single s = new Single();
  private Single() {}
  public static Single getInstance() {
    return s;
  }
}
public class SingleDemo {
  public static void main(String[] args) {
      Single ss=Single.getInstance();
  }
}


                   2.懒汉式----模式代码

                         类一加载,不会先实例,首先是空值,在调用返回对象的方法中实例,一调用方法实例对象才存在。


public class ESingle {
    private static ESingle s=null;
    private ESingle(){}
    public static ESingle getInstance(){
    if(s==null){
       s=new ESingle();
    }
    return s;
    }
}
public class SingleDemo {
  public static void main(String[] args) {
      ESingle s1=ESingle.getInstance();      
  }
}


                3.下面举一个设置颜色的例子 


public class Single {
  private static Single s = new Single();
  private String color="灰色";
  private Single() {}
  public static Single getInstance() {
    return s;
  }
  public static Single getS() {
    return s;
  }
  public static void setS(Single s) {
    Single.s = s;
  }
  public String getColor() {
    return color;
  }
  public void setColor(String color) {
    this.color = color;
  }
 
 
}
public class SingleDemo {
  public static void main(String[] args) {
      Single s1=Single.getInstance();
      Single s2=Single.getInstance();
      System.out.println("s1------"+s1.getColor());
      s2.setColor("红色");
      System.out.println("s1------"+s1.getColor());
      System.out.println("s2------"+s2.getColor());
  }
}


结果:

s1------灰色

s1------红色

s2------红色

从结果中可以看出,只要是本类的对象,在设置颜色后,只要是本类的对象,他们都会同时改变,这就是单例模式的特点。

 

                    4.结构加载顺序图。

  


 

                 5.懒汉式的增加安全性。

     

public class ESingle {
  private static ESingle s = null;
 
  private ESingle() {
  }
 
  public static ESingle getInstance() {
    if (s == null) {
      synchronized (ESingle.class) {
         if (s == null)
           s = new ESingle();
      }
    }
    return s;
  }
}


这样就增加了懒汉式的安全性,在以后的开发中,饿汉式用的比较多,这样加上锁后,增加安全性,判断次数也比较少,那么效率也不会变小。先判断,然后判断进锁。

               6. 疑问:

         那为什么把实例化的对象定义成公有的且静态的,这样就可以不用使用方法来返回,这样也可以防止多线程出现异常,就可以用类名直接调用了。这样不就更方便呢啊!

public class Single {
  public static Single s = new Single();
  private Single() {}
}
public class SingleDemo {
  public static void main(String[] args) {
      Single s1=Single.s;       
  }
}


如果是这样的话,那么就能够这样设置Single.s=null;那么就会把单例中的对象暴露出来了,这样就不安全了,如果这样设置的话,那么就相当于给其对象设置了set方法!所以我们要杜绝这样设计!

---------------------- ASP.Net+Android+IOS开发   .  .Net培训.-----------期待与您交流! -------------------

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值