常用设计模式-单例模式

常用设计模式-单例模式

是什么

单例模式是一种常见的软件设计模式,他的核心结构中只包含一个被称为单例的特殊类,通过单例可以保证系统中,应用该模式的一个类只有一个实例,即一个类只有一个实例对象。

有什么

单例模式要求类能过有返回对象的一个引用和获取该实例的一个方法(必须是一个静态方法,一般使用getInstance这个名词命名)

怎么做

单例的实现主要是通过以下步骤:

  1. 定义一个私有的静态引用(即属性)
  2. 将类的构造方法定义为私有方法,这样其他的代码无法通过调用该类的方法来实例对象,只有通过该类提供的静态方法来得到实例
  3. 在该类提供一个静态方法,当我们调用这个方法的时候如果类持有的引用不为空就返回这个引用,如果为空就创建这个对象的实例并将实例只想改类的引用

代码实例

  1. 饿汉模式(静态常量)
public class Singleton{
    private static Singleton singleton=new Singleton();
    private  Singleton(){}
    private static Singleton getInstance(){
        return singleton;
    }
}
  1. 饿汉模式(静态代码库)
public class Singleton{
    private static Singleton singleton;
    static {
        singleton =new Singleton();
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return singleton;
    }
}
  1. 懒汉模式不同步
public class Singleton{
    private static Singleton singleton;
    private Singleton(){}
    public static Singleton getInstance(){
        if(singleton ==null ){
            singleton=new Singleton();
        }
        return singleton;
    }
}
  1. 懒汉模式同步
public class Singleton{
    private static Singleton singleton;
    private Singleton(){}
    public synchronized static Singleton getInstance(){
        if(singleton == null){
            singleton=new Singleton();
        }
        return singleton;
    }
}
  1. 懒汉模式(同步)
public class Singleton{
    private static Singleton singleton;
    private Singleton(){}
    public  static Singleton getInstance(){
        if(singleton == null){
            synchronized(Singleton.class){
             singleton=new Singleton();
            }
           
        }
        return singleton;
    }
}
  1. 枚举类型
public enum Singleton{
    Instance;
    public void hello(){
        
    }
}
  1. 静态内部类
public class Singleton{
    private Singleton(){}
    private static class SingletonInstance{
        private static final Singleton INSTANCE=new Singeton();
    }
    private static Singleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
}
  1. 双重检查
public class Singleton{
    private volatile static Singleton singleton;
    private Singleton(){}
    public static Singleton getInstance(){
        if(singleton == null){
            synchronized(Singleton.class){
                if(singleton == null){
                    singleton=new Singleton();
                }
            }
        }
        return singleton;
    }
}

什么时候用

  • 需要频繁的创建和销毁对象
  • 创建对象耗时过多或者耗费资源过多,但又经常用到
  • 工具类对象
  • 频繁访问数据库或者文件的对象

优缺点

  • 优点:系统中该类只存在一个对象,节省了资源,对于频繁创建或者使用的对象使用单例可以提高系统性能
  • 缺点:实例化必须通过静态方法获取而不是new;

你可能感兴趣的:(常用设计模式-单例模式)