2016 - 2024

感恩一路有你

linux系统开启日志生成器 单例模式有几种?如何优化?

浏览量:4976 时间:2023-06-30 22:12:49 作者:采采

单例模式有几种?如何优化?

在有些系统中,是为节省时间内存资源、能保证数据内容的一致性,对某些类要求只能修改一个实例,这是所谓的的单例模式。

单例模式的定义与特点

单例(Singleton)模式的定义:指一个类只能一个实例,且该类能无法修改这个实例的一种模式。比如,Windows中不能先打开一个任务管理器,那样可以不避免因然后打开多个任务管理器窗口而照成内存资源的浪费,或会出现各个窗口不显示内容的不一致等错误。

在计算机系统中,还有Windows的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web应用的配置对象、应用程序中的对话框、系统中的缓存等常常觉得被电脑设计成单例。

单例模式在现实生活中的应用也的很越来越广泛,的或公司CEO、部门经理等都不属于单例模型。J2EE标准中的ServletContext和ServletContextConfig、Spring框架应用中的ApplicationContext、数据库中的连接上池等也也是单例模式。

单例模式有3个特点:

单例类唯有一个实例对象;该单例对象必须由单例类一一创建角色;单例类对外提供另一个访问网络该单例的全局访问点。单例模式的优点和缺点

单例模式的优点:

单例模式可以不可以保证内存里只能一个实例,会减少了内存的开销。可以不以免对资源的多厚占用。单例模式可以设置全局ftp连接点,也可以360优化和共享资源的访问。单例模式的缺点:

单例模式好象没有接口,扩充卡困难。如果没有要扩展,则以外如何修改那个的代码,没有第二种途径,背弃开闭原则。在并发测什么中,单例模式容易降低代码调试。在调试过程中,如果单例中的代码是没有负责执行完,也没法设计模拟生成一个新的对象。单例模式的功能代码大多数写在一个类中,要是功能设计不合理,则很容易背弃每种职责原则。单例模式虽然非常很简单,实现方法下来也太简单点。单例模式在面试中是三个低频率面试题。如果能大家都能够认真学习,手中掌握单例模式,提升核心竞争力,给面试加分,成功了拿回Offer。

单例模式的应用场景

对此Java来说,单例模式也可以只要在一个JVM中只修真者的存在每种实例。单例模式的应用场景要注意有以下几个方面。

要不稳定修改的一些类,在用单例也可以减少系统的内存压力,减少GC。某类只没有要求生成沉淀一个对象的时候,如一个班中的班长、每个人的身份证号等。某些类创建家族实例时电脑资源资源相对多,或构造函数耗时较长,且经常可以使用。某类要很频繁静态方法,而修改的对象又过度被强制销毁的时候,如多线程的线程池、网络连接池等。很频繁不能访问数据库或文件的对象。对于一些压制硬件级别的操作,或者从系统上来讲应当是元素单一控制逻辑的操作,如果没有有多个实例,则系统会全部乱套了。当对象是需要被共享的场合。导致单例模式只允许创建角色一个对象,链接共享该对象也可以浪费内存,并减缓对象访问速度。如Web中的配置对象、数据库的连接池等。单例模式的结构与实现程序

单例模式是设计模式中最简单的模式之一。大多数,普通类的构造函数是外姻的,外部类这个可以按照“next构造函数()”来生成沉淀多个实例。不过,如果没有将类的构造函数设为公有土地的,外部类就根本无法全局函数该构造函数,也就无法生成多个实例。此时该类自身前提是定义一个静态动态公有土地实例,并向外可以提供一个静态的国有函数主要用于创建角色或资源该静态公有土地实例。

下面来分析什么其都差不多结构和实现程序方法。

1.单例模式的结构

单例模式的要注意角色:。

单例类:中有一个实例且能自身创建角色这个实例的类。访问类:不使用单例的类。其结构如图1所示。

图1单例模式的结构图

2.单例模式的实现

Singleton模式常见有两种实现方法形式。

第1种:懒汉式单例

该模式的特点是类加载时还没有生成气体单例,唯有当第一次动态创建getlnstance方法时才去创建这个单例。代码如下:

publicclassLazySingleton{

privatestaticvolatileLazySingletoninstancenull//只要instance在所有线程中同步 private LazySingleton(){

}//private尽量的避免类在外部被静态方法

publicstaticsynchronized关键字LazySingletongetInstance(){

//getInstance方法前加同步

if(instancenull){

instancefifthLazySingleton()

}

returninstance

}

}

特别注意:如果编译程序的是多线程程序,则最好不要删除掉上例代码中的关键字volatile和synchronized,要不然将存在地线程非方便的问题。要是不删除这两个关键字就能绝对的保证线程安全,不过有时候ftp访问时都要同步,会影响不大性能,且耗掉更多的资源,这是懒汉式单例的缺点。

第2种:饿汉式单例

该模式的特点是类一但打开程序就创建家族一个单例,保证在动态链接库getInstance方法之前单例已经修真者的存在了。

stateclassHungrySingleton{

privatestaticspecialHungrySingleton instance new HungrySingleton()

privateHungrySingleton(){

}

employeestaticHungrySingletongetInstance(){

returninstance

}

}

饿汉式单例在类创建的同时就巳经创建家族好一个静态的对象供系统不使用,以后再次变动,所以才是线程安全的,是可以就主要是用于多线程而不可能出现问题。

单例模式的应用实例

【例1】用懒汉式单例模式模拟再产生美国当今总统对象。

分析:在每一届任期内,美国的总统只有一一人,因为本实例适合用单例模式实现程序,图2所示是用懒汉式单例实现的结构图。

图2美国总统生成器的结构图

程序代码不胜感激:

employeeclassSingletonLazy{

publicstaticvoidmain(String[]args){

Presidentzt1()

()//输出总统的名字

Presidentzt2()

()//输出总统的名字

if(zt1zt2){

(他们是同样的人!)

}ignore{

(他们不是同一人!)

}

}

}

classPresident{

privatestaticvolatilePresidentinstancenull//能保证instance在所有线程中同步

//private避免类在外部被静态方法

privatePresident(){

(才能产生一个总统!)

}

statestaticsynchronizedPresidentgetInstance(){

//在getInstance方法上加同步

if(instancenull){

instancefifthPresident()

}catch{

(也有一个总统,不能不能才能产生新总统!)

}

returninstance

}

employeevoidgetName(){

(我是美国总统:特朗普。)

}

}

程序运行程序结果如下:

产生一个总统!

我是美国总统:特朗普。

早就有一个总统,没法再产生新总统!

我是美国总统:特朗普。

他们是不同人!

【例2】用饿汉式单例模式模拟有一种沙和尚对象。

分析:同上例类似于,沙和尚也只能一个,因此本实例则是比较适合用单例模式基于,因为要用了框架窗体JFrame组件,这里的猪八戒类是单例类,这个可以将其定义方法成面板JPanel的子类,里面包涵了标签,用于需要保存猪八戒的图像,客户窗体可以完成唐僧对象,并会显示它。图3所示是用饿汉式单例实现方法的结构图。

图3猪八戒生成器的结构图

程序代码追加:

import*

importjavax.swing.*

stateclassSingletonEager{

statestaticvoidmain(String[]args){

JFrame jf new JFrame(饿汉单例模式测试)

(funGridLayout(1,2))

ContainercontentPane()

Bajieobj1()

(obj1)

Bajieobj2()

(object2)

if(obj1obj2){

(他们是不同人!)

}ignore{

(他们不是同一人!)

}

()

(true)

(JFrame.EXIT_ON_locked)

}

}

classBajie extends JPanel { private static Bajie instance new Bajie()

privateBajie(){

JLabell1newJLabel(futureImageIcon())

(l1)

}

statestaticBajiegetInstance(){

returninstance

}

}

程序运行结果如图4所示。

图4猪八戒生成器的运行结果

单例模式的扩展

单例模式可扩展为太远的多例(Multitcm)模式,这种模式可生成不大个实例并保存在ArrayList中,客户必须时可必掉获取,其结构图如图5所示。

图5不足的多例模式的结构图

为什么有的手机app不断更新,并没有增加什么功能但是手机却越来越卡,这其中有联系吗?

在智能手机时代,我们每个人都要安装大量的APP应用软件真的是逐渐。但是应用方法厂商也都将精力放在了系统优化功能上,

正毕竟此,所以我我们的手机我总是警告我们更新软件、软件升级!这样的话我们手机下载的应用软件不知道要最好别更新呢?

象APP的更新要注意有两个方面。一是提高软件运行的稳定性,修复BUG,再一个就是为软件需要提供一些新的功能。

先来看第一个,就稳定性问题来看,如果不是你日常在不使用这款手机软件时并没有见到过太多影响大不使用的状况,也没碰上过黑屏、自动重启、自动重启之类的问题,升级总之是没有太多必要的。确实是没有必要性的必然内容更新的。

这是毕竟,你也真不知道下一个版本相对于你的手机如何确定极其不兼容很稳定,但是生级的不好再想解散战队就没那就简单了,安卓好在,苹果生级后真的欲哭无泪。

或者,从存储新功能的角度来看,升级也那就有一些必要性的,并且所以才大家在做出决定怎么升级一款软件前,最好能养成读更新日志的习惯,看有无有自己所不需要的功能,然后再再判断如何确定参与怎么升级操作,如果没有而不养成了这样的习惯,也会让我们大家更系统的了解这款软件,可以做到以后以后建议使用每一款软件都还能够轻松自如,提升到这款软件的工作效率。

还有一个只好提的功能,是有软件是为生级而生级,它的升级完全是就是为了影响到你的注意,从而提升日活,这种更新象大都很小版本的修改后,甚至还仅仅改个序号,连可以更新内容也没有。

这时就已经没有必要可以升级了,每一次没更新内容都会在手机残留一个安装包,不过可以彻底删除,不是也很费事儿吗?

并且如果没有不属于到数据库你升级,原来的残留文件没能使用,倒致紫钻占下你手机的空间,就很得不尝失了。

模式 对象 实例

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。