单例设计模式
单例设计模式属于创建型模式,提供了一种创建对象的最佳方式
基本思想:保证一个类中只能有一个实例,避免频繁的创建和销毁对象,减少内存开销, 并提供一个访问它的全局访问点
避免对资源的多重占用(比如写文件操作)
package cn.tedu.java;
/** 单例设计模式:
* 属于创建型模式,提供了一种创建对象的最佳方式
* 基本思想:
* 保证一个类中只能有一个实例,避免频繁的创建和销毁对象,减少内存开销,并提供一个访问它的全局访问点
*
* 避免对文件的多重占用(比如写文件操作)
*
* 缺点:没有接口,不能继承.
* */
public class Singleton {
public static void main(String[] args) {
MySingleton1 s1 = MySingleton1.getInstance();
MySingleton1 s2 = MySingleton1.getInstance();
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
MySingleton2 s3 = MySingleton2.getInstance();
MySingleton2 s4 = MySingleton2.getInstance();
System.out.println(s3 == s4);
System.out.println(s3.equals(s4));
}
}
/**
* 饿汉式:
* 直接创建对象.线程安全
* 优点:获取类的时候,创建并初始化,加载较慢,但获取对象较快,
* 直接创建实例对象,不管你是否需要这个对象都会创建
*
* 缺点:没有达到懒加载效果,如果对象没有被使用,造成了资源的浪费
*
* (1)构造器私有化
* (2)并用静态变量保存
* (3)向外提供这个实例,强调这是一个单例,可以用final修改
*/
class MySingleton1 {
private MySingleton1() {}
private static final MySingleton1 singleton = new MySingleton1();
public static MySingleton1 getInstance() {
return singleton;
}
}
/**
* 懒汉式:
* 延迟创建对象
* 优点:第一次调用时才初始化.避免了内存的浪费
* 缺点: 必须synchronized才能保证单例,但加锁会影响效率
*/
class MySingleton2{
private MySingleton2(){}
private static MySingleton2 singleton;
public static MySingleton2 getInstance(){
if (singleton==null){
synchronized (MySingleton2.class){
if (singleton==null){
singleton=new MySingleton2();
}
}
}
return singleton;
}
}
饿汉式的另一种枚举形式
/**
* 枚举类型
* 表示该类型的对象是有限的几个
* 我们可以限定为一个,就成了单例
*
* @author guoxin
* @date 2021/10/12
*/
public enum Singleton2 {
INSTANCE
}