Java 单列模式(Singleton)
单例模式(Singleton)
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
目的:使得类的一个对象成为系统中的唯一实例。
如何保证一个类只有一个实例并且这个实例易于被访问呢?
我们都知道,一个类多次被new 创建后,获取的是不同实例。
创建一个类 public class NewObject { } 测试 public class NewOne { public static void main(String[] args) { NewObject no1= new NewObject(); NewObject no2= new NewObject(); System.out.println("no1--->"+no1); System.out.println("no2--->"+no2); } }
控制台输出的是:
由此可知:要想产生单个实例就得:让类自身负责保存它的唯一实例,这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。
-
- 单例模式的类只提供私有的构造函数
- 类定义中含有一个该类的静态私有对象
- 提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象
一般Singleton有是三种模式:懒汉式(最常用)、饿汉式、 双重锁
懒汉式:
public class Singleton { /* * 懒汉式单例:只有在第一次请求实例的时候创建,并且只在第一次创建后,以后不再创建该类的实例 */ // 1.一个私有的指向自己的静态变量 private static Singleton instance; // 2.私有的构造方法,保证不能从外部创建对象 private Singleton(){} // 3.公开的静态工厂方法,返回该类的唯一实例(当发现没有实例没有初始化的时候才初始化) public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); System.out.println("创建Singleton类的实例"); }else { System.out.println("实例已经创建,不能再创建"); } return instance; } }
public class Test { public static void main(String[] args) { Singleton s = Singleton.getInstance(); System.out.println("第一次---->"+s); System.out.println("第二次---->"+Singleton.getInstance()); System.out.println("第三次---->"+Singleton.getInstance()); } }
饿汉式:
public class Singleton2 { /* * 恶汉单例模式:在类加载的时候就创建一个单例模式. */ // 1.私有的构造函数,确保不能在类的外部访问该类的构造函数 private Singleton2(){ System.out.println("构造函数执行了"); } // 2.私有的唯一的静态实例变量,在类加载的时候就创建好单例对象 private final static Singleton2 instance = new Singleton2(); // 3.公开的静态工厂返回此类的唯一实例 public static Singleton2 getInstance(){ return instance; } }
public class Test { public static void main(String[] args) { Singleton2 s1 = Singleton2.getInstance(); System.out.println(s1); System.out.println(Singleton2.getInstance()); System.out.println(Singleton2.getInstance()); } }
双重锁
package com.单列模式; public class Singleton3 { private static Singleton3 instance=null; private Singleton3(){ System.out.println("构造函数开始!"); } public static synchronized Singleton3 getInstance(){ if(instance==null){ synchronized(Singleton3.class){ if(instance==null){ instance=new Singleton3(); } } } return instance; } }
public class Test { public static void main(String[] args) { Singleton3 s3 =Singleton3.getInstance(); System.out.println(s3); System.out.println(Singleton3.getInstance()); System.out.println(Singleton3.getInstance()); } }
谢谢大家的关注。小弟才疏学浅,更新的很慢,但我会把自己学的倾囊相授。人生两大悲剧:一是万念俱灰,一是踌躇满志。