设计模式:单例模式

第一个设计模式:

设计模式听着挺牛X的,其实就是编程中的一种常用结构,当遇到某种特定问题的时候,这些设计模式能更好地实现功能。要是不用设计模式能把代码写出来也可以,只是这些经过众牛人研究过,也经过时间考验过的编写方式应该更有效率,更具安全性。下面是一个相对简单的设计模式:单例模式。

什么是单例模式:一个类在内存中只有一个对象(也就是只有一个实例)。

目的:

1、  避免其他方法再次建立该类的对象,先控制禁止其他方法建立该类对象。

2、  其他方法需要访问到该类对象,因此要在本类中自定义一个对象。

3、  方便其他方法对自定义对象的访问,需要提供一些访问方法。

代码实现:

1、  将构造函数私有化(防止其他方法再次建立对象)

2、  在类中创建一个本类对象(其他方法不能建立对象,只能在类中自己建立一个)

3、  提供一个方法可以获取该类对象(其他方法不能建立对象,可以让它们获取类自己创建的在这个对象)

饿汉式://一般使用这个,安全性高

class Single {

   private String name;

   private Single(){} //私有,防止其他方法创建新对象

   private static Single s = new Single();

   public  static Single getInstance(){

      return s;

   }

   public static void main(String[] args) {

      Single s = Single.getInstance();

      System.out.println(s.name); //刚创建完对象s,其name为null

      s.name= "lisi";//为这个对象中的name赋值

      System.out.println(s.name);

      Single s2 = Single.getInstance();//另外s2也要访问这个对象

      System.out.println(s2.name);//输出的是lisi,因为就一个对象

   }

}

懒汉式://面试中经常考这里,但现实工作中不常用

class Single1 {

   private Stringname;

   private Single1(){}

//在Single1s = Single1.getInstance();语句中,

//Single1 s 时先不生成对象,

//等到调用到single1里面的getInstance方法时,才创建对象。称之为懒汉式

   private static Single1 s = null;

   public  static Single1getInstance(){

      if (s==null)

      {

         s = new Single1();

      }

         return s;

   }

   public static void main(String[] args) {

      Single1 s = Single1.getInstance();

      System.out.println(s.name);

      s.name= "lisi";

      System.out.println(s.name);

      Single1 s2 = Single1.getInstance();

      System.out.println(s2.name);

   }

}

 


但是这里有一个问题:

   public  static Single1 getInstance(){

      if (s==null)

      {

         s = new Single1();

      }

         return s;

   }

当A方法执行到 if(s==null)时,由于没有对象创建,所以可以进入到s= new Single1()这一句之前,准备创建对象,如果这个时候cpu停下来去执行其他东西,有可能会有另外一个B方法执行到if语句,因为此时没有对象,所以也可以到 s = new Single1(),去创建另外一个对象,这样就不能保证只有一个对象创建。

解决方法:

加入多线程中的同步synchronized,使得只有一个方法能进入到getInstance方法中去创建对象。

代码如下:

   public  static synchronized Single1 getInstance(){

      if (s==null)

      {

         s = new Single1();

      }

         return s;

   }

 

但是因为每次执行到这里都会判断是否有方法在getInstance之内,而synchronized的效率很低,因此又有了双重判断来提高效率:

 

   public  static  Single1 getInstance(){

      if (s==null)

      {

         synchronized(Single1.class)

         {

            if (s==null)

                s = new Single1();

         }

      }

         return s;

   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值