Java设计模式-单例模式

Java设计模式-单例模式


在长期的程序设计过程中,开发者们总结出了很多设计经验,最终经过整理和优化,变成了如今的设计模式;


设计模式有很多 有单例,工厂,代理等等。这里推荐一本关于Java设计模式的书籍 Head First设计模式


今天我们这里讲解的是最常用的单例模式;


在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在;

有两种实现,一种是饿汉式,一种是懒汉式;


我们上下代码,先上 饿汉式实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package  com.java1234.chap03.sec18;
 
public  class  Singleton {
 
     /**
      * 构造方法私有
      */
     private  Singleton(){
         
     }
     
     /**
      * 饿汉式单例实现
      */
     private  static  final  Singleton single= new  Singleton();
     
     /**
      * 获取实例
      */
     public  static  Singleton getInstance(){
         return  single;
     }
}


这里我们构造方法私有 这样就保证了在外部是无法来实例化对象;

然后我们先在内部定义一个静态常量对象,然后再写一个static方法 来返回这个对象,这样就保证是一个对象了;


我们上下测试类:

1
2
3
4
5
6
7
8
9
10
package  com.java1234.chap03.sec18;
 
public  class  Test {
 
     public  static  void  main(String[] args) {
         Singleton singleton1=Singleton.getInstance();
         Singleton singleton2=Singleton.getInstance();
         System.out.println(singleton1==singleton2);
     }
}

运行输出:

true


这里获取里两个对象 我们前面讲过 用“==”来判断对象是否指向同一个内存区域,这里返回true,说明是同一个对象;



我们这里再来实现下 懒汉式子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package  com.java1234.chap03.sec18;
 
public  class  Singleton2 {
 
     /**
      * 构造方法私有
      */
     private  Singleton2(){
         
     }
     
     /**
      * 懒汉式单例实现 在第一次调用的时候实例化
      */
     private  static  Singleton2 single;
     
     /**
      * 获取实例
      */
     public  synchronized  static  Singleton2 getInstance(){
         if (single== null ){
             System.out.println( "第一次调用的实例化" );
             single= new  Singleton2();
         }
         return  single;
     }
}


我们可以看到 区别  饿汉式是先定义实例的 而懒汉式是先定义引用,当第一次调用getInstance的时候 进行对象实例化操作;

当然这里我们考虑到多并发的情况 多个线程同时调用这个方法的时候,会出现问题,所以我们加了同步锁 synchronized 来保证

同一时刻只有一个线程进入方法;


再上下测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package  com.java1234.chap03.sec18;
 
public  class  Test {
 
     public  static  void  main(String[] args) {
         Singleton singleton1=Singleton.getInstance();
         Singleton singleton2=Singleton.getInstance();
         System.out.println( "饿汉式:" +(singleton1==singleton2));
         
         Singleton2 singleton3=Singleton2.getInstance();
         Singleton2 singleton4=Singleton2.getInstance();
         System.out.println( "懒汉式:" +(singleton3==singleton4));
         
     }
}

运行输出:

饿汉式:true

第一次调用的实例化

懒汉式:true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值