Java单例模式实现方法与特点详解

创始人
2024-12-27 06:32:14
0 次浏览
0 评论

如何在Java中实现单例模式?

大致有五种编写单例模式的方法;也就是说,懒惰的人,恶人安静的内心枚举和双重检查锁。

1.共同的写作风格;如何编写lazy

classLazySingleton{privatestaticLazySingletonprivateLazySingleton(){}publicstaticLazySingletongetInstance(){        if(singlet)上==空)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         p>2。
流氓方法的缺点是不具备延迟加载效果

classHungrySingleton{privatestaticHungrySsingletonsingleton=newHungrySingleton();privateHungrySingleton(){}publicstaticHungrySingletongetInstance(){returnsingleton;由于它没有被主动使用,所以称为延迟加载

classInternalSingleton{privatestaticclassSingletonHolder{privatefinalstaticInternalSingletonINSTANCE=newInternalSingleton(}privateInternalSingleton(){}publicstaticInternalSingletongetInstance(){returnSingletonHolder.INSTANCE;}}

4.优点:不仅避免了多线程同步问题,而且反序列化也阻止创建新对象

inenumEnumSinglet{INSTANCE;publicvoiddoSomeThing(){}}

5.内存模型中无效privatevolatileLockSingletonprivateLockSingleton(){       //参见:http://www.ibm.com/developerworks/cn/java/j-dcl.html公共静态LockSingletongetInstance(){if(singleton==null){singleton=newLockSingleton();}                                                                                                                                                                                  

如何写一个标准的Java单例模式

Java中的单例模式是一种流行的设计模式。
独奏模式共有三种类型:慢速独奏模式、饥饿独奏模式和唱片式独奏模式。
单例类有以下特点:1.一个单例类只能有一个实例。
2.单例类必须创建自己唯一的实例。
3.单例类必须向所有其他对象提供此实例。
单例模式确保类只有一个实例,创建自身的实例并将该实例提供给整个系统。
在计算机系统中,线程池、缓存、日志对象、对话框、打印机和显卡驱动程序对象通常被设计为单例。
所有这些应用程序都以一种或另一种形式具有资源管理器的功能。
每台计算机可以有多台打印机,但只能有一个PrinterSpooler,以防止两个打印作业同时输出到打印机。
每台计算机可以有多个通信端口,系统必须对这些通信端口进行集中管理,防止一个通信端口同时被两个请求调用。
简而言之,个体模式选择的目的是避免出现不一致的情况,避免长期政治。
首先我们看一下经典的单次执行。
publicclassSingleton{privatestaticSingletonuniqueInstance=null;privateSingleton(){//Existsonlytodefeatinstantiation.}publicstaticSingletongetInstance(){if(uniqueInstnce==null){uniqueInstance=newSingleton();}returnuniqueInstance;}//其他方法...}Singleton避免实例化类外部通过将build方法限制为同一虚拟机范围内的私有方法,Singleton的Unique实例只能通过getInstance()方法来访问。
(事实上​​,可以通过Java的反射机制用私有构造函数实例化一个类,这本质上会使所有单独的Java实现失效。
这里不讨论这个问题。
我们假设反射机制不存在。
)上述实现没有考虑线程安全的问题。
所谓线程安全是指:如果你的代码所在的进程中有多个线程同时运行,这些线程可能会同时运行这段代码。
如果每次运行的结果都和单线程运行的结果一样,并且其他变量的值和预期一样,那么就是线程安全的。
换句话说:类或程序提供的接口是线程的原子操作,或者说多个线程之间的切换不会导致接口的实现结果出现歧义,这意味着我们不需要考虑同步问题。
显然,上面的实现不满足字符串完整性要求消息,并发环境中可能会出现多个Singleton实例。
////////////////////////////////////////////////////////////////////////////////////////////////////模式验证示例单数////////////////////////////////////////////////////////////////////////////////////////publicclassTestStream{privateStringname;publicStringgetName(){returnname;}公共无效setName(Stringname){this.name=name;}//这个类只能有一个实例publicTestStream(){}//不带参数的私有构造函数//这个类必须自己创建//有两个方法publicstaticTestStreamts1=null;//这个类应该自动向整个系统提供这个实例对象publicstaticTestStreamgetTest(){if(ts1==null){ts1=newTestStream();}returns1;}publicvoidgetInfo(){System.out.println("outputmessage"+name);}publicstaticvoidmain(String[]args){TestStreams=TestStream.getTest();s.setName("张晓祥1");System.out.println(s.getName());TestStreams1=TestStream.getTest();s1.setName("张小翔2");System.out.println(s1.getName());s.getInfo();s1.getInfo();if(s==s1){System.out.println("创建同一个实例");}elseif(s!=s1){System.out.println("未创建相同实例");}else{System.out.println("applicationerror");}}}////////////////////////////////////////////////////

什么叫单例模式,如何实现,有什么作用?

仅举一个例子,最简单的单调方式可以使用static来实现。
例如,以下_Context变量使用单利模式。
全局只有一个_Context,如publicclassEESGateway{privatestaticEESDatabaseDataContext_Context=null;//EESDatabasDataContexInstanceprivateconststringdatabaseName="EESDatabase";//数据名称//////ReturnEESDatabaseDataContextinstance.//////EESDatabaseDataContextinstancepublicstaticEESDatabaseDataContextDataContext(){if(_Context==null){lock(typeof(EESGateway)){//formatenewstringtostoretheconnectionStringStringconnectionString=ConfigurationManager.ConnectionStrings["EESDatabase"].ConnectionString;//createadataContextusingtheconnectionStringabove_Context=newEESDatabaseDataContext(connectionString);}}return_Context;
热门文章
1
Java字符串分割技巧:轻松获取逗号前的... java任意一个字符串,当它碰到第一个逗号时,返回逗号前面的字符串,例如:str...

2
SQL多表连接查询全解析:JOIN语句应... sql多表关联查询在执行SQL多表连接查询时,可以使用JOIN语句将多个表连接在...

3
Java中字符串类型详解:String与... 变量有字符类型,为什么没有字符串类型??基本类型:charshort、int、l...

4
JavaSE与JavaEE:从基础到企业... javase 和javaee的区别?JavaSE和JavaEE...

5
Java程序员面试必知:核心技术问答与技... java编程程序员技术面试常见面试?随着互联网的不断发展,Java开发已经成为很...

6
Java.exe与Javaw.exe:区... 程序中java和javaw有什么区别java和javaw的区别:两者都是Java...

7
深入解析:Java中的javax包及其与... JAVA导入时,什么是javax?awt是java1.0,swing是java2...

8
Java包基础:命名空间与代码组织指南 java中的包是什么意思?包是Java中组织代码的基本结构。这种结构可以帮助我们...

9
Java AWT与Swing:全面解析二... java.awt和javax.swing有什么区别AWT是AbstractWin...

10
Java字符串比较:如何检测子字符串在另... java怎样判断一个字符串中的某个字符或字符串包含于另一个字符串publiccl...