设计模式:单例模式
序言
单例模式属于创建型模式,当项目中某个对象在整个声明周期中只需要创建一个实例时可以使用单例模式。如:经常用到的对象,工具类对象,频繁访问数据库或文件的对象。单例模式一共有八种创建方式,这里只介绍七种。
/*单例模式*/
//饿汉式(静态变量)
/*
* 优点:
* 写法简单,类装载的时候就创建实例,避免了线程同步的问题。
* 缺点:
* 若一直没有用过则会浪费内存。
* 注:
* 可以使用
*/
class Singleton{
//将构造器私有化
private Singleton() {}
//本类内部创建实例
private final static Singleton instance = new Singleton();
//提供公用静态方法返回实例
public static Singleton getInstance() {
return instance;
}
}
//饿汉式(静态代码块)
/*
* 优缺点同上
*/
class Singleton2{
//将构造器私有化
private Singleton2() {}
//在静态代码块中创建实例
private static Singleton2 instance;
static {
instance = new Singleton2();
}
//提供公用静态方法返回实例
public static Singleton2 getInstance() {
return instance;
}
}
//懒汉式(线程不安全)
/*
* 优点:
* 起到懒加载的作用。
* 缺点:
* 线程不安全。
* 注:实际开发中不建议使用
*/
class Singleton3{
//将构造器私有化
private Singleton3() {}
private static Singleton3 instance;
//提供公用静态方法,当使用时才创建实例
public static Singleton3 getInstance() {
if(instance==null) {
instance = new Singleton3();
}
return instance;
}
}
//懒汉式(线程安全)
/*
* 优点:
* 起到懒加载的作用,并且线程安全。
* 缺点:
* 每个线程在获得实例时都需要同步,效率太低。
* 注:
* 开发中不建议使用。
*/
class Singleton4{
//将构造器私有化
private Singleton4() {}
private static Singleton4 instance;
//提供公用静态方法,当使用时才创建实例,使用同步代码块线程安全
public static synchronized Singleton4 getInstance() {
if(instance==null) {
instance = new Singleton4();
}
return instance;
}
}
//懒汉式双重检查
/*
* 优点:
* 线程安全,懒加载,效率高。
* 注:
* 推荐使用
*/
class Singleton5{
//将构造器私有化
private Singleton5() {}
//volatile关键字可以将修改立即更新到主存
private static volatile Singleton5 instance;
//提供公用静态方法,加入双重检查代码,解决线程安全问题和懒加载问题
public static Singleton5 getInstance() {
if(instance==null) {
synchronized (Singleton5.class) {
if(instance==null) {
instance=new Singleton5();
}
}
}
return instance;
}
}
//懒汉式(静态内部类)
/*
* 优点:
* 懒加载,线程安全。
* 注:
* 推荐使用
*/
class Singleton6{
//将构造器私有化
private Singleton6() {}
//类在装载时静态内部类不会被装载,当调用getInstance方法时,
//才会装载静态内部类,只会装载一次且线程安全
private static class SingletonInstance{
private static final Singleton6 INSTANCE = new Singleton6();
}
//提供公用静态方法
public static Singleton6 getInstance() {
return SingletonInstance.INSTANCE;
}
}
//枚举
/*
* 线程安全,推荐使用
*/
enum Singleton7{
INSTANCE;
public void sayOK() {
System.out.println("OK!");
}
}