单例模式(Singleton)应用场景和优缺点

单例模式(Singleton)应用场景和优缺点单例(Singleton)模式 也叫单态模式概述:单例(Singleton)模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任。 从另一个角度来说,Singleton模式其实也是一…

大家好,又见面了,我是你们的朋友全栈君。

单例(Singleton)模式 也叫单态模式

概述:单例(Singleton)模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。

这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任。 从另一个角度来说,Singleton模式其实也是一种职责型模式。因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责!

 

核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点

 

应该在什么时候下使用单例模式?

  举一个小例子,在我们的windows桌面上,我们打开了一个回收站,当我们试图再次打开一个新的回收站时,Windows系统并不会为你弹出一个新的回收站窗口。,也就是说在整个系统运行的过程中,系统只维护一个回收站的实例。这就是一个典型的单例模式运用。

  继续说回收站,我们在实际使用中并不存在需要同时打开两个回收站窗口的必要性。假如我每次创建回收站时都需要消耗大量的资源,而每个回收站之间资源是共享的,那么在没有必要多次重复创建该实例的情况下,创建了多个实例,这样做就会给系统造成不必要的负担,造成资源浪费。

  再举一个例子,网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制

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

  从上述的例子中我们可以总结出适合使用单例模式的场景和优缺点:  

   适用场景: 1.需要生成唯一序列的环境

                       2.需要频繁实例化然后销毁的对象。

                       3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 

                       4.方便资源相互通信的环境

   优点:1.实现了对唯一实例访问的可控

               2.对于一些需要频繁创建和销毁的对象来说可以提高系统的性能。

   缺点:1. 不适用于变化频繁的对象
               2.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出。

               3.如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失。

package wm;

class SingleTonDemo{
	// 1):必须在该类中,自己先创建出一个对象
	private static SingleTonDemo single = new SingleTonDemo();
	
	// 2):私有化自身的构造器,防止外界通过构造器创建新的对象
	private SingleTonDemo() {}
	
	 // 3):向外暴露一个公共的静态方法用于获取自身的对象
	 public static SingleTonDemo getInstance() {
		 
		return single;
	 }
	 //  执行操作
	 public void sort() {
		 System.out.println("执行的方法");
	 }
}
public class SingleTonDemoTest{
	public static void main(String[] args) {
		// 执行操作
		SingleTonDemo.getInstance().sort();
	}
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147250.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 求圆周率python_用python算圆周率的步骤

    求圆周率python_用python算圆周率的步骤Python你知道多少?教你玩转Python变量与常量!变量与常量变量:在程序运行过程中,值会发生变化的量常量:在程序运行过程中,值不会发生变化的量无论是变量还是常量,在创建时都会在内存中开辟一块空间,用于保存它的值。这里有一点需要注意的是,在python中是不需要声明类型的。这是根据Python的动态语言特性而来。变量可以直接使用,而不需要提…文章诸葛青云h2019-04-28997浏览量蒙…

    2022年9月13日
    4
  • string.h中的strlen,strcat,strcpy,strncpy,strcmp,strlwr,strupr函数

    string.h中的strlen,strcat,strcpy,strncpy,strcmp,strlwr,strupr函数

    2021年9月28日
    44
  • Java三种方式实现发送xml参数的WebService接口调用

    Java三种方式实现发送xml参数的WebService接口调用项目开发中与第三方系统数据对接遇到的问题,仅用作记录。1.使用cxf调用(联调时没有收到响应信息)JaxWsDynamicClientFactoryclientFactory=JaxWsDynamicClientFactory.newInstance();logger.info(JSON.toJSON(todoInfo));Clientclient=clientFacto…

    2022年7月12日
    19
  • Android学习路线指南

    Android学习路线指南前言看到一篇文章中提到“最近几年国内的初级Android程序员已经很多了,但是中高级的Android技术人才仍然稀缺“,这的确不假,从我在百度所进行的一些面试来看,找一个适合的高级Android工程师的确不容易,一般需要进行大量的面试才能挑选出一个比较满意的。为什么中高级Android程序员不多呢?这是一个问题,我不好回答,但是我想写一篇文章来描述下Android的学习路线,期望可以帮助更多的…

    2022年6月11日
    37
  • Android滑动解锁功能实现,Android_滑动解锁

    Android滑动解锁功能实现,Android_滑动解锁1.滑动解锁代码流程图:流程图图片资源:https://pan.baidu.com/s/1tkcw0tdxV78mnwHqOtcAGg提取码:2xsq2.代码:xml文件:xmlns:app=”http://schemas.android.com/apk/res-auto”xmlns:tools=”http://schemas.android.com/tools”android:layout_wi…

    2022年6月29日
    39
  • 电脑屏幕反光怎么处理?

    电脑屏幕反光怎么处理?

    2021年9月18日
    768

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号