设计模式1:单例模式(1)

  什么是单例模式?

  保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

  作用:在整个生命周期,一个类的所有对象,都是指向了同一块内存空间,而系统不需要为该类的每一个对象都在堆分配空间。任何时候,单例类的实例只有一个。

     
  单例模式是通过单例类来实现的,其中单例类的构成分为三部分:

  1.指定其构造方法为私有的

  2.定义一个公有的类变量作为该类的唯一对象

  3.公开一个公共方法用来获取这个类的唯一实例

    注:类的构造方法我们一般定义为公有的,但它也可以定义为私有,当一个类的构造方法被定义为私有的时候,我们就没法使用这个构造方法了,也就是不能通过这个构造方法来创建该类的对象了,当一个类的所有构造方法都定义为私有,那么我们就无法在该类之外创建这个类的对象,所有就必须提供一个公共的方法,外界通过这个唯一的入口来获取一个已经实例化的类了。

  单例模式有两种:

  1.饿汉式线程安全

  2.懒汉式线程不安全

    其中饿汉式和懒汉式的不同仅在于这个类的唯一实例创建的时机,饿汉式是在外界获取这个实例之前就已经初始化了这个实例,而懒汉式则是在外界第一次获取这个实例的时候才初始化这个实例,以后不再初始化,懒汉式是线程不安全的,原因在于当多个线程都开始创建这个对象时,由于cpu是采用时间片轮转法,可能会返回单例类对象的多个引用,从而导致线程不安全。

  饿汉式:

 1 class SingleInstance{
 2     //定义一个本类的对象
 3     private static SingleInstance singleInstance = new SingleInstance();
 4     
 5     //构造方法私有化:不能在本类的外部通过new创建对象
 6     private SingleInstance(){
 7         
 8     }
 9     
10     //向外界提供可访问的方法,返回当前类的对象
11     public static SingleInstance getInstance(){
12         return singleInstance;
13     }
14 }

 

  懒汉式:

 1 class SingleInstance{
 2     //定义一个本类的对象
 3     private static SingleInstance singleInstance;
 4     
 5     //构造方法私有化:不能在本类的外部通过new创建对象
 6     private SingleInstance(){
 7         
 8     }
 9     
10     //向外界提供可访问的方法,返回当前类的对象
11     public static SingleInstance getInstance(){
12                 if(singleInstance==null)
13                     singleInstance = new SingleInstance();          
14         return singleInstance;
15     }
16 } 

 

  示例:创建单例类的两个对象,判断这两个对象的引用是否相同。

 1 package com.pattern;
 2 
 3 public class Test1 {
 4     public static void main(String[] args) {
 5         //创建两个对象
 6         SingleInstance singleInstance1 = SingleInstance.getInstance();
 7         SingleInstance singleInstance2 = SingleInstance.getInstance();
 8         
 9         //打印这两个引用所指向的对象地址
10         System.out.println("singleInstance1:"+singleInstance1);
11         System.out.println("singleInstance2:"+singleInstance2);
12         System.out.println(singleInstance1==singleInstance2);
13         
14     }
15 }
16 class SingleInstance{
17     //定义一个本类的对象
18     private static SingleInstance singleInstance = new SingleInstance();
19     
20     //构造方法私有化:不能在本类的外部通过new创建对象
21     private SingleInstance(){
22         
23     }
24     
25     //向外界提供可访问的方法,返回当前类的对象
26     public static SingleInstance getInstance(){
27         return singleInstance;
28     }
29 }
源代码

  效果:

  单例模式的应用场景:

  

  (图片来源:http://blog.csdn.net/tanyujing/article/details/14160941)

 

  未完,待续。

  

  

posted on 2015-09-12 20:07  AellenLei  阅读(184)  评论(0编辑  收藏  举报

导航