单例模式(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画爱心表白

    2025年9月25日
    5
  • camera(二) DVP接口「建议收藏」

    camera(二) DVP接口「建议收藏」ov26401632*1232sccb总线一个点8位10位uxga15帧/s(1632*1232)svga30(800*600)cif60(352*288)如果芯片被初始化为x*y,那么是横方向有x个像素,纵方向有y个像素。如何初始化,一般芯片都有初始化序列然后图像从D0-D14过来。(D0-D14是一个像素)PCLK用来同步一个像素的数据。…

    2022年6月13日
    70
  • 关于DOCTYPE html PUBLIC[通俗易懂]

    关于DOCTYPE html PUBLIC[通俗易懂]关于

    2022年7月12日
    23
  • Repeater使用方法—基础数据绑定+多级嵌套「建议收藏」

    Repeater使用方法—基础数据绑定+多级嵌套「建议收藏」一、基础数据绑定Repeater控件在编译后不会生成任何多余的代码,而GridView等编译后会生成table标签,这样对于页面的负担和UI样式影响方面,使用Repeater就会显得很有优势了。下面

    2022年7月2日
    23
  • php网页如何发布_php问题

    php网页如何发布_php问题如何正确发布PHP代码几乎每一个PHP程序员都发布过代码,可能是通过FTP或者rsync同步的,也可能是通过svn或者git更新的。一个活跃的项目可能每天都要发布若干次代码,但是现实却是很少有人注意其中的细节,实际上这里面有好多坑,很可能你就在坑中却浑然不知。一个正确实现的发布系统至少应该支持原子发布。如果说每一个版本都表示一个独立的状态的话,那么在发布期间,任何…

    2022年9月27日
    1
  • eclipse使用svn更新代码_eclipse安装svn

    eclipse使用svn更新代码_eclipse安装svn1.先去将本地的代码更新到最新,如果更新内容较少,可以点击资源同步,具体可以看一下博主:svn创建svn图文2.更新成最新的代码之后,点击创建补丁,点击第二个file文本框,选择一个文件夹存下一个文件。3.打开申请上线权限,。点击puth,填写./4.申请通过之后,复制review+版本号5.将复制的版本号放到comment下6.点击ok。…

    2025年8月7日
    3

发表回复

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

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