java设计模式(一)之单例模式详解

-------android培训、java培训、期待与您交流! ----------

(设计模式)Design pattern

主要经典的设计模式总共有二十三种,现在我们来看看设计模式中第一个经典设计模式单例模式(Singleton)。单例模式表示一个类只会生成唯一的一个对象。

 

单例模式有两张实现方式:

第一种:

 

publicclassSingleton {

  

   publicstaticvoidmain(String[] args) {

      A a1=A.getInstance(); 

      A a2=A.getInstance();

      System.out.println(a1==a2);//判断A类型的引用是否相等,是的话返回true

  }

}

class A{

  privatestatic Aa=new A();//必须用修饰符private,且static修饰,否则无法被静态方法使用

  private A(){ //构造方法也要设成私有的,这样防止在别的方法里new一个A

  }

  publicstatic A getInstance(){ //获得实例,且用static是为了使用方便使用类调用静态方法,因为构造方法已经new,无法生成一个引用啊

     returna//将返回A类型的引用 a的地址,即new A();

  }

}

 

第二种:

publicclassSingleton {

  

   publicstaticvoidmain(String[] args) {

      A a1=A.getInstance(); 

      A a2=A.getInstance();

      System.out.println(a1==a2);//判断A类型的引用是否相等,是的话返回true

  }

}

class A{

  privatestatic Aa;//必须用修饰符private,且static修饰,否则无法被静态方法使用

  private A(){ //构造方法也要设成私有的,这样在别的方法里就无法new一个A

  }

  publicstatic A getInstance(){ //获得实例

     if(a==null){ 

        a=new A();

     }

     

     returna//将返回A类型的引用 a的地址,即new A();

  }

}

 

 

总结:单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例

 

我们说Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)

但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。

这里是演示第二种单例模式多线程的写法:

 class SingleDemo  

  public static void main(String[] args) throws Exception 
  { 
    MyTest mt=MyTest.getInstance(); 
    System.out.println(mt); 
  } 

 
class MyTest 

  private static MyTest mt=null; 
   
  private MyTest(){}; 
 
  public static MyTest getInstance()throws Exception{ 
    if (mt==null)//加上这个判断,可以少进行一次同步锁的判断,提高了效率 
    { 
      synchronized(Class.forName("MyTest")){//同步代码块提高了代码的安全性。 
        if (mt==null) 
        { 
          mt=new MyTest(); 
        } 
      } 
    } 
    System.out.println(mt); 
    return mt; 
  } 

结论:总之一句话,单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值