单例模式是什么

单例模式:系统运行期间,有且仅有一个实例
在这里插入图片描述
为什么要用单例模式?
单例模式节省公共资源,对应到我们计算机里面,像日志管理、打印机、数据库连接池、应用配置。
单例模式方便控制,就像日志管理,如果多个人同时来写日志,你一笔我一笔那整个日志文件都乱七八糟,如果想要控制日志的正确性,那么必须要对关键的代码进行上锁,只能一个一个按照顺序来写,而单例模式只有一个人来向日志里写入信息方便控制,避免了这种多人干扰的问题出现。

要点:
1.某个类只能有一个实例
2.必须自行创建实例
3.必须自行向整个系统提供这个实例

实现:
1.只提供私有的构造方法
2.含有一个该类的静态私有对象
3.提供一个静态的共有方法用于创建、获取静态私有对象

单例模式的实现方式:
懒汉模式:类加载时不创建实例,运行调用时创建实例,具备延迟加载,
线程不安全。
在这里插入图片描述
解决线程不安全的三种方法:
1.使用手动锁lock
2.使用自动锁synchronized
3.使用安全类,如java.util.concurrent下的类

饿汉模式:类加载时就创建实例,加载慢,获取对象快,线程安全,
不具备延迟加载。可以使用静态内部类来解决延迟问题。
在这里插入图片描述
一般情况下推荐使用饿汉模式;

静态内部类:
在这里插入图片描述
单例模式的优缺点:
优点:
1.在内存中只有一个对象,节省内存空间
2.避免对共享资源的多重占用
3.允许可变数目的实例
4.单例模式具有一定的伸缩性,类自己来控制实例化进程,
类就在改变实例化进程上有相应的伸缩性
5.提供了对唯一实例的受控访问
缺点
1.由于单利模式中没有抽象层,因此单例类的扩展有很大的困难
2.单例类的职责过重,在一定程度上违背了“单一职责原则”
3.如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,
造成对象状态丢失

单例模式的使用场景:
1.创建对象占用资源过多,但同时又需要用到该类对象
2.对系统内资源要求统一读写,如读写配置信息
3.当多个实例存在可能引起程序逻辑错误,如号码生成器

单例模式的应用场景:
1.多线程的线程池的设计
2.数据库连接池的设计
3. 网站的计数器
4. windows的Recycle Bin(回收站)
5. Web应用的配置对象的读取等

需要注意事项:
1.使用时不能用反射模式创建单例,否则会实例化一个新的对象
2.使用懒单例模式时注意线程安全问题
3.饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承(如登记式模式)

发布了2 篇原创文章 · 获赞 2 · 访问量 102

猜你喜欢

转载自blog.csdn.net/m0_46437194/article/details/104587715