读书笔记之单例模式

来源:互联网 发布:高中软件 编辑:程序博客网 时间:2024/06/11 06:45

单例模式
如果我们一开始就给对象赋值一个全局变量,就必须在程序一开始就创建好对象,但是如果这个对象非常浪费资源,而我们又一直没有用到它,就形成了巨大的浪费!我们利用单件模式,就可以在需要的时候创建该对象。
单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
首先我们知道一个类没有公共的构造器就无法生成任何对象,一个类默认是一个无参public构造器,那么在其它地方就可以很容易的多次实例化该类:

public class myClass(){    public myClass(){}}

但是我们想将这个类设置成单例模式就必须让构造器私有化,不能被随意调用

public class myClass(){    private myClass(){}}

然后我们在该类中人为的制造一个静态的getInsatnce方法用来返回一个myClass对象

public class myClass(){    //这样该类就不会被实例化    private myClass(){}    //获取唯一可用的对象    public static myClass getInstance(){      return new myClass();    }    //创建一个方法    public void say(){       System.out.println("Hello World!");    }}

//测试一下

public class Singleton{   public static void main(String[] args) {      //不合法的构造函数      //编译时错误:构造函数 SingleObject() 是不可见的      //myClass class = new myClass();      //获取唯一可用的对象      myClass class = myClass.getInstance();      //显示消息      class.showMessage();   }}

应用场景:比如两台电脑连接的同一个打印机,输出的时候肯定保证只有一台打印机在使用;产生唯一序列号;WEB中的计数器
单例的几种实现模式:
一、懒汉式:线程不安全

public class Singleton {      //只做初始化,判断后才回返回实例对象,虽然性能好但是不支持多线程    private static Singleton instance;      private Singleton (){}      public static Singleton getInstance() {      if (instance == null) {          instance = new Singleton();      }      return instance;      }  }  

二.懒汉式,但加上同步锁synchronized,线程安全

public class Singleton {      private static Singleton instance;      private Singleton (){}      public static synchronized Singleton getInstance() {      if (instance == null) {          instance = new Singleton();      }      return instance;      }  } 

三、饿汉式

public class Singleton {      //在静态初始化器(static initializen)中创建单例,这段代码保证了线程安全,一般建议使用这种方法,但如果有明细懒加载的需求,才会使用第五种方法    private static Singleton instance = new Singleton();      private Singleton (){}      public static Singleton getInstance() {      return instance;      }  }

四.双重加锁,线程安全并且能保证高性能,实现起来较复杂

public class Singleton {      private volatile static Singleton singleton;      private Singleton (){}      public static Singleton getSingleton() {      if (singleton == null) {          synchronized (Singleton.class) {          if (singleton == null) {              singleton = new Singleton();          }          }      }      return singleton;      }  } 

五.静态内部类

public class Singleton {      //这种方式同样利用静态初始化保证了初始化instance时只有一个线程,但跟第三种方式不同,第三种方式只要singleton类被装载了,instance就会被实例化,这种方式只有调用getInstance方法时,才会装载singleton类。如果实例化instance很消耗资源,就可以使用这种方法更为合适
    private static class SingletonHolder {      private static final Singleton INSTANCE = new Singleton();      }      private Singleton (){}      public static final Singleton getInstance() {      return SingletonHolder.INSTANCE;      }  }

六.枚举

public enum Singleton {      INSTANCE;      public void whateverMethod() {      }  } 

这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。

0 0
原创粉丝点击