单例模式
第一种创建形式
package com.xmaven.singleton;
/**
* @ClassName SingletonOne
* @Description TODO 单例模式 -- 饿汉模式 创建对象实例的时候直接初始化 空间换时间的形式
* @Author Ambition
* @Date 2021/1/12 15:17
* @Version 1.0.0
**/
public class SingletonOne {
/**
* 实现过程
* 1. 只提供私有的构造方法
* 2. 含有一个该类的私有对象
* 3. 提供一个静态的公有引用与创建、获取静态私有对象
*/
//1. 创建类中的私有构造
private SingletonOne(){
}
//2. 创建该类型的私有静态实例
private static SingletonOne instance = new SingletonOne();
//3. 创建公有静态方法返回静态实例对象
public static SingletonOne getInstance(){
return instance;
}
}
测试:
package com.xmaven.test;
import com.xmaven.singleton.SingletonOne;
/**
* @ClassName MainOne
* @Description TODO 单例模式--饿汉式测试
* @Author Ambition
* @Date 2021/1/12 15:22
* @Version 1.0.0
**/
public class MainOne {
public static void main(String[] args) {
SingletonOne one = SingletonOne.getInstance();
SingletonOne two = SingletonOne.getInstance();
System.out.println(one);
System.out.println(two);
// 他们引用的都是一个地址
}
}
第二种创建形式
package com.xmaven.singleton;
/**
* @ClassName SingletonTwo
* @Description TODO 单例模式--懒汉式 类内实例对象创建时并直接初始化,知道第一次调用get方法时,才完成初始化操作 时间换空间
* @Warning 懒汉式存在进程风险
* @Deal 解决方法 1. 同步锁 2. 双重检验锁 3. 静态内部内 4. 枚举
* @Author Ambition
* @Date 2021/1/12 15:28
* @Version 1.0.0
**/
public class SingletonTwo {
//1. 创建私有构造方法
private SingletonTwo(){
}
//2. 创建静态的该类实例对象
private static SingletonTwo instance = null;
//3. 创建开放的静态方法提供实例对象
public static SingletonTwo getInstance(){
if (instance == null){
instance = new SingletonTwo();
}
return instance;
}
}
测试:
package com.xmaven.test;
import com.xmaven.singleton.SingletonTwo;
/**
* @ClassName MainTwo
* @Description TODO 单例模式 -- 懒汉式测试
* @Author Ambition
* @Date 2021/1/12 15:33
* @Version 1.0.0
**/
public class MainTwo {
public static void main(String[] args) {
SingletonTwo one = SingletonTwo.getInstance();
SingletonTwo two = SingletonTwo.getInstance();
System.out.println(one);
System.out.println(two);
}
}
单例模式
优点:
1.在内存中只有一个对象,节省内存空间
2.避免频繁的创建销毁对象,提高性能
3.避免对共享资源的多重占用
缺点:
1.拓展比较困难
2.如果实例化后的对象长期不利用,系统将会默认为垃圾进行回收,造成对象状态丢失
使用场景:
1. 创建对象资源时占用资源过多,但同时又需要用到该对象
2. 对系统内资源要求统一读写,如读写配置信息
3. 当多个实例存在可能引起程序逻辑错误,如号码生成器
评论区