首页 > 其他分享 >单例模式

单例模式

时间:2024-10-22 14:47:07浏览次数:7  
标签:Singleton getInstance 模式 instance static 单例 new public

定义

保证一个类只有一个实例,并且提供一个访问该全局访问点

优缺点

优点:

  • 一个类只有一个实例:防止其他对象对自己的实例化,确保所有的对象都访问一个实例。
  • 有一定的伸缩性:类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩。
  • 提供了对唯一实例的受控访问。
  • 因为在系统内存种只存在一个对象,因此可以节约资源。
  • 允许可变数目的实例。
  • 避免对共享资源的多重占用。

缺点

  • 不适用于变化的对象
  • 单例模式没有抽象层,所以单例类的扩展有很大的困难。
  • 单例类职责过重,在一定程度上违背了单一职责原则。
  • 滥用单例会造成一些负面影响:为了节省资源将数据库连接池对象设计为的单例类,可能会导致,共享连接池对象的程序过多而出现连接池溢出。
  • 如果实例化的对象长时间不被利用,系统会认为是 垃圾而被回收,这将导致对象状态的丢失。

应用

windows的任务管理器、回收站

任务管理器它不能打开两个

线程池:需要方便对池种的线程进行控制。

对于一些应用程序的日志应用,或者web开发中读取配置文件都适合使用单例模式,如HttpApplication 就是单例的典型应用。

网站计数器:如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的

设计思想:

  1. 不允许其他程序用new对象(new就是开辟新的空间,每一次new都产生一个对象)
  2. 在该类中创建对象(这里的对象需要在本类中new出来)
  3. 对外提供一个可以让其他程序获取该对象的方法(因为对象是在本类中创建的,所以需要提供一个方法让其它的类获取这个对象)

思想实现

(1)私有化该类的构造函数
(2)通过new在本类中创建一个本类对象
(3)定义一个公有的方法,将在该类中所创建的对象返回

饿汉式:类初始化,就会加载对象

public class Singleton {
    //通过new在本类中创建一个本类对象
    private static Singleton instance=new Singleton();
    //构造方法私有
    private Singleton(){

    };
    //定义一个公有的方法,将在该类中所创建的对象返回
    public static Singleton getInstance(){
        return instance;
    }
    
     public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);
    }
}

  • 在类加载的时候就完成了实例化,避免了线程的同步问题

  • 由于在类加载的时候就实例化了,所以没有达到Lazy Loading(懒加载)的效果,也就是说可能我没有用到这个实例,但是它也会加载,会造成内存的浪费(但是这个浪费可以忽略,所以这种方式也是推荐使用的)

懒汉式:调用getInstance方法的时候才会创建对象

这种方式是在调用getInstance方法的时候才创建对象的,所以它比较懒因此被称为懒汉式

public class Singleton {
	private static Singleton instance;
	private Singleton() {
        
    };
	public synchronized static Singleton getInstance(){
		if(instance==null){
			instance=new Singleton();
		}
		return instance;
	}
    	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		System.out.println(s1 == s2);
	}
}

如果不加synchronized锁:

此方式存在线程安全问题:

多个线程执行这个方法的时候会实例化多个对象

当第一个线程在执行if(instance==null)这个语句时,此时instance是为null的进入语句。

在还没有执行instance=new Singleton()时(此时instance是为null的)

第二个线程也进入if(instance==null)这个语句,

因为之前进入这个语句的线程中还没有执行instance=new Singleton(),

所以它会执行instance=new Singleton()来实例化Singleton对象,

因为第二个线程也进入了if语句所以它也会实例化Singleton对象。

这样就导致了实例化了两个Singleton对象。

所以单例模式的懒汉式是存在线程安全问题的

静态内部类[推荐用]

public class Singleton{
	private Singleton() {
        
    };
	private static class SingletonHolder{
		private static Singleton instance=new Singleton();
	}
	public static Singleton getInstance(){
		return SingletonHolder.instance;
	}
}
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		System.out.println(s1 == s2);
	}

​ 这里结合了懒汉式和饿汉式的优点,真正需要对象的时候才会加载,并且加载类线程是安全的。

⑤枚举[极推荐使用]

public class Singleton {
    
    public static Singleton getInstance(){
        return SingletonEnum.instance.getInstance();
    }
    
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);
    }

    private static enum SingletonEnum {
        instance;
        private Singleton singleton;
        private SingletonEnum(){
            singleton = new Singleton();
        }
        public Singleton getInstance(){
            return singleton;
        }
    }
}

实现简单、调用效率高,枚举本身就是单例,由jvm从根本上提供保障!避免通过反射和反序列化的漏洞,

缺点没有延迟加载。

标签:Singleton,getInstance,模式,instance,static,单例,new,public
From: https://www.cnblogs.com/Gguopeng/p/18492684

相关文章

  • MCP4921DAC芯片硬件设计及驱动代码(PIC单片机硬件SPI模式)
    MCP4921DAC芯片硬件设计及驱动代码(PIC单片机硬件SPI模式)MCP4921简介MCP4921是一款由MicrochipTechnology生产的单通道、12位数模转换器(DAC),具有外部电压参考引脚和SPI接口。它具有以下主要特点:12位分辨率:提供高精度的模拟输出。单通道电压输出:适用于需要单一......
  • 使用PIC单片机驱动OLED模块(软件模拟IIC模式)
    @使用PIC单片机驱动OLED模块(软件模拟IIC模式)使用PIC单片机驱动OLED模块(软件模拟IIC模式)最近学习Microchhip的PIC18系列单片机,使用该款单片机进行一些外设的开发。发现网上的资料很少,故开了此个博客,对自己的学习过程进行一些记录,希望未来国内Microchip的社区能有更多的资源......
  • 第十七课:Python学习之单例模式
    单例目标单例设计模式__new__方法Python中的单例01.单例设计模式设计模式设计模式是前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟的解决方案使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性单例设......
  • 【JavaEE】【多线程】单例模式
    目录一、设计模式1.1单例模式1.1.1饿汉模式1.1.2懒汉模式1.2线程安全问题1.3懒汉模式线程安全问题的解决方法1.3.1原子性问题解决1.3.2解决效率问题1.3.3解决内存可见性问题和指令重排序问题一、设计模式在讲解案例前,先介绍一个概念设计模式:就是大佬们......
  • ActiveMQ消息模式Queue和Topic机制讲解
    Docker安装ActiveMQ镜像以及通过Java生产消费activemq示例_dockeractivemq-CSDN博客背景周末由于服务器异常宕机,导致业务系统重启后出现ActiveMQ中的数据没有被正常消费,运维认为是消息积压,便联系博主排查。最终发现并不存在消息积压,是因为采用ActiveMQTopic模式生产消费......
  • CH9120串口配置模式程序参考
    测试工具:CH32v307+CH9120编译IDE:MounRiver相关文档:https://files.cnblogs.com/files/blogs/808422/CH9120%E4%B8%B2%E5%8F%A3%E6%8E%A7%E5%88%B6%E6%8C%87%E4%BB%A4%E9%9B%86.zip?t=1727600534&download=true参考代码:https://files.cnblogs.com/files/blogs/808422/CH912x%E4%......
  • 3、模板方法模式
    一、模板方法模式,简单的说就是在一个上层的抽象类中,定义了一些操作的抽象方法,有一个总体的方法组织了怎么去调用这个操作方法,而操作方法的具体实现由子类去实现,达到抽取公共部分放在父类模板中,子实现各自己不对的部分publicabstractclassAbstractTemplate{protectedvi......
  • 03.建造者模式设计思想
    03.建造者模式设计思想目录介绍01.建造者模式介绍1.1建造者模式由来1.2建造者模式定义1.3建造者模式场景1.4建造者模式思考02.建造者模式实现2.1罗列一个场景2.2创造对象弊端场景2.3案例演变分析2.4用例子理解建造者03.建造者模式分析3.1建造者模式......
  • 【设计模式】一文搞懂策略模式
    目录什么是策略模式策略模式结构策略模式的优点和缺点项目实战实际场景代码实现(策略模式+工厂模式)优惠券折扣金额的策略接口优惠金额策略打折直减满减工厂类环境类总结什么是策略模式策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使......
  • HarmonyOS:UIAbility组件的启动模式
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......