天天看点

单例模式(一)

单例模式(Singleton Pattern),又称单体模式,解决的问题是保证一个类在内存中对象的唯一性(类只有一个实例)。

定义

将类的责任集中到唯一的单体对象中,确保该类只有一个实例,并且为该类提供一个全局访问点。(难点不在单体模式的实现,在于系统中任何识别单体和保证单体的唯一性)

单例模式如何保证对象的唯一性?

  1. 不允许其他程序用new创建该对象。
  2. 在该类中创建一个本类实例。
  3. 对外提供一个方法让其他程序获取该对象。

单例模式保证对象唯一性的步骤?(和上面对应)

  1. 私有化构造函数。private Singleton(){—}。如果不把构造器声明为private或protected,编译器会自动创建一个public的构造函数。
  2. 使用静态域(static)来维护实例。将单体对象作为单体类的静态域实例化,其类型就是单例类型本身。private static Singleton s = null; 如果不想其被重载,加上final。
  3. 使用静态方法监视实例的创建(分为饿汉式和懒汉式)。
// 饿汉式:
public class Singleton {
   private final static Singleton instance = new Singleton();
   private Singleton(){}
   public static Singleton getInstance(){
       return s;
   }
}
//懒汉式
public class Singleton {
   private static Singleton instance = null;
   private Singleton() {}
   public static Singleton getInstance() {
     if(instance == null) {
     instance = new Singleton();
     return instance;
   } 
}
           

第一种叫饿汉式,开发时使用比较多,类一创建,对象就创建。这种方式浪费了内存。(内存中有静态区和非静态区)

第二种类加载时没有对象,只有调用了getInstance()方法时才会创建对象,此时创建的也是普通的实例,注意对比着看,这种事延迟加载,节省内存,但是在多线程并发访问时,可能保证不了对象的唯一性。

上一篇: 责任链模式

下一篇: 单例模式(二)

继续阅读