java设计模式之单例模式的介绍

来源:互联网 发布:ubuntu拼音打不出中文 编辑:程序博客网 时间:2024/06/04 21:07
1.单例模式的简介
     设计模式的概念:人们造房子的时候,最初是一座一座的建,慢慢的发现其实是一种套路可循的,现在人们在设计房子时,很多时候是根据之前设计过的模型直接拿来用,这种模型就是一种设计模式。
     设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。其目的是为了代码的可重用性,让代码更容易被他人理解。
     java中共有23中设计模式,下面介绍单例模式:

     那么什么是单例模式呢?打个比方,就现代而言,很多人都会娶老婆,那么老婆只有一个就足够了,多了就会出问题。对于程序而言,有些对象只需要一个,比如:配置文件、工具类、线程池、缓存、日志对象等。如果创造出多个实例,就会导致许多问题,如占用资源过多,不一致的结果等。那么如何保证整个应用中某个实例有且只有一个呢?这就要用到单例模式。

2.单例模式常分为两种:饿汉模式、懒汉模式。

    2.1饿汉模式

     建立两个类:Singleton.java及Test.java
     Singleton.java:
public class Singleton{                              }
     一般情况下,要创建类的对象,应在Test.java的main方法中:
Singleton s1 = new Singleton( );Singleton s2 = new Singleton( );
     这就创建了两个实例,但是现在要求要实现单例,所以第一步:将默认的构造方法设置为私有化,不允许外部直接创建对象。此时 Singleton.java的代码为:
          Singleton.java:
public class Singleton{    private Singleton( ){                                }               }
     此时问题来了,构造方法私有化以后,外部就无法创建类的实例,而现在单例模式要求要有一个实例,那解决方法是用自己的私有方法来创建实例,因此第二步:
      Singleton.java:
public class Singleton{            private Singleton( ){                                   }            //static是将其变为类的成员,外部可以访问到            private static Singleton instance = new Singleton( );                                 }
     这样就可以在Test.java的main函数中使用Singleton.instance来实例化一个对象。
     但是,我们都了解面向对象的封装,根据java的访问原则,不允许直接访问成员变量,因此第三步:提供一个用于获取实例的方法
      Singleton.java:
public class Singleton{              private Singleton( ){                                        }                    //static是将其变为类的成员,外部可以访问到                    private static Singleton instance = new Singleton( );                   public static Singleton getInstance( ){                         return instance;                    }                                       }
    总结一下,三步:
    (1) 默认的方法设置为私有化,不允许外部直接创建对象
    (2)创建类的唯一实例,使用private static修饰
    (3)提供一个用于获取实例的方法,使用public static修饰
    通过以上三步,便可以构建单例模式的饿汉模式,那么饿汉模式体现在哪儿呢?先想一下创建这个static的唯一实例的代码会在什么时候加载呢?答案是静态的成员是属于类所有的,因此当类被加载的时候就会创建这个实例,不管用户是否调用了这个实例,它都已经被加载了,所以它称为没吃饱,它要早些先吃饱,我们形象的称之为饿汉模式。
    
    2.2懒汉模式:
     懒汉模式和饿汉模式的区别仅在于在进行第二步操作时,只是声明实例,而没有去实例化,然后在第三步进行判断并返回,Singleton2.java的代码为:
Singleton2.java:
          public class Singleton2{                    private Singleton2( ){                                        }                    private static Singleton2 instance;                    //static是将其变为类的成员,外部可以访问到                       public static Singleton2 getInstance( ){                         if(instance == null){                              instance = new Singleton2( );                         }                          return instance;                    }                                         }
     因此从懒汉模式可以看出,当类被加载时,它并没有创建唯一的实例,而是当用户获取的时候,才真正的进行判断。

    3.两者的特点及区别:
     (1) 对于饿汉模式,加载类时比较慢,但运行时获取对象的速度比较快
     (2) 对于懒汉模式,加载类时比较快,但运行时获取对象的速度比较慢
     (3) 对于饿汉模式而言,它是线程安全的,对于懒汉模式,它是线程不安全的

0 0