-
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例。
-
优点:
- 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
-
如何实现?
-
饿汉式vs 懒汉式
public class Singleton { public static void main(String[] args) { Bank bank1 = Bank.getInstance(); Bank bank2 = Bank.getInstance(); System.out.println(bank1 == bank2);//true Order order1 = Order.getInstance(); Order order2 = Order.getInstance(); System.out.println(order1 == order2);//true } } //饿汉式 class Bank{ //1.私有化类的构造器 private Bank() { } //2.内部创建类的对象 //4.要求此对象同样是静态的 private static Bank instance = new Bank(); //3.提供公共的静态方法,返回类的对象 public static Bank getInstance() { return instance; } } //懒汉式 class Order{ //1.私有化类的构造器 private Order() { } //2.声明当前对象,没有初始化 //4.要求此对象同样是静态的 private static Order instance = null; //3.声明public. static的返回当前类对象的方法 public static Order getInstance() { if(instance == null) { instance = new Order(); } return instance; } }
-
3.区分饿汉式和懒汉式
- 饿汉式:
- 坏处:对象加载时间过长。
- 好处:饿汉式是线程安全的
- 懒汉式:
- 好处:延迟对象的创建。
- 以上代码的写法坏处:线程不安全。
- 解决方法:
class Bank { private Bank() { } private static Bank instance = null; //public static synchronized Bank getInstance(){ public static Bank getInstance() { //效率稍差 // synchronized (Bank.class) { // if (instance == null) { // instance = new Bank(); // } // } // return instance; //效率稍高:除了先进入判断条件的几个线程,后续线程都可以跳过同步直接获取instance if (instance == null) { synchronized (bank.class) { if (instance == null) { instance = new Bank(); } } } return instance; } }
- 饿汉式:
-
-
应用场景
- 网站的计数器,一般也是单例模式实现,否则难以同步。
- 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
- 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
- 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,都生成一个对象去读取。
- Application也是单例的典型应用
- Windows的Task Manager (任务管理器)就是很典型的单例模式
- Windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
单例设计模式之饿汉式、懒汉式
最新推荐文章于 2024-07-10 21:37:49 发布