java常用设计模式的学习笔记(单例模式)

java 常用设计模式——单例模式(Singleton pattern)


前言

对设计模式的概念,作用等不清楚的可以去菜鸟教程了解,先。


一、单例模式

单例模式是一种创建型设计模式,该设计模式下类只能创建一个实例,并提供访问该实例的唯一方法getInstance()(全局访问方法)。这也就意味着该类的构造方法不能是public,不能在外部创建该对象实例。因此在使用该类的方法是不需要实例化对象,直接访问即可,这也解决了频繁创建和删除对象实例而造成的内存开销问题。

在这里主要提到的是两种单例设计模式,即饿汉式和懒汉式。

二、常用实现方法

1.饿汉式

代码如下(示例):

public class SingletonDemo {

    // 使构造方法为private,保证该类在其他类被实例化
    private SingletonDemo (){};
    // 创建一个实例
    private static SingletonDemo singletonDistance=new SingletonDemo();
    // 获取唯一可用的实例,
    public static SingletonDemo getInstance(){
        return singletonDistance;
    }
    // 其他类方法可以通过getInstance 返回的唯一实例去调用。
    public void display(){
        System.out.println("单例模式");
    }
}

2.使用实例

代码如下(示例):

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		// 获取唯一实例
		SingletonDemo singletonDemo=SingletonDemo.getInstance();
		// 调用单例类中的方法。
		singletonDemo.display();

	}

饿汉式是最常用的单例模式,在类内部创建了一个静态的实例对象,这也就是说该实例对象在类加载的时候就创建了,不会在其他线程调用该类的时候才去创建,这样就保证了该设计模式是线程安全的。

3. 懒汉式

懒汉式是另一种单例设计模式,通过synchronized关键字防止多个线程对类多吃实例化,来实现线程安全。
代码如下(示例):

public class SingletonDemo {

    // 使构造方法为private,保证该类在其他类被实例化
    private SingletonDemo (){};
    // 声明一个实例
    private static SingletonDemo singletonDistance;
    // 获取唯一可用的实例,被调用时创建实例存在线程安全问题,使用synchronized
    // 保证线程安全
    public static synchronized SingletonDemo getInstance(){
    	if(singletonDistance==null){
    		singletonDistance=new SingletonDemo();
    	}
        return singletonDistance;
    }
    // 其他类方法可以通过getInstance 返回的唯一实例去调用。
    public void display(){
        System.out.println("单例模式");
    }
}

三、对比

饿汉式 如果单例类没被使用,就会产生无用对象,造成内存浪费,但执行效率较高。

懒汉式 被调用时才会去创建实例,因此不会造成内存浪费,但因为加锁降低了执行效率。

四、 使用场景

单例模式主要解决一个实例频繁的创建和销毁而造成内存开销较大的问题,它的使用的例子如下:

  1. 线程池的设计就是采用单例模式,避免了线程的频繁创建和销毁带来的内存消耗问题,也方便线程池对线程创建的控制。
  2. 任务管理器或设备管理器也是采用了单例模式。
  3. 网站计数器也是采用了单例模式,每次刷新先用单例缓存,不用更新数据库,来实现同步。
  4. 数据库的连接池也是采用了单例模式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值