Java单例模式深入解析及实例代码分享
单例模式单例模式实例
在Java中,单例模式确保类只存在一个实例。
该模式的主要作用是控制类的实例创建过程,保证所有对象都可以访问唯一的实例,以实现实例控制、灵活性、减少内存使用。
单例模式示例代码如下:
java
publicclassSingleton{
privatestaticSingletoninstance=null;
privatesingleton(){
//初始化代码
}
publicstaticSingletongetInstance(){
if(instance==null){
instance=newSingleton();
}
returninstance;
}
}
以下是三种常见的形式:
第一种:最常用formjava
publicclassSingleton{
privatestaticSingletoninstance=null;
privateSingleton(){
//初始化代码
}
公关人员aticSingletongetInstance(){
if(instance==null){
instance=newSingleton();
}
returninstance;
}
}
第二种:内部类形式
Javaa
publicclassSingleton{
privatestaticSingletoninstance=newSingleton();
privateSingleton(){
//初始化代码
}
PublicStaticSingletongetInstance(){
returninstance;
}
}
第三种:双重检查锁形式
Java
publicClassSingleton{
privateStaticSingletonInstance=null;
privateSingleton(){//初始化代码
}
publicstaticSingletongetInstance(){
if(instance==null){
Synchronized(singleton.class){
我f(null==instance){
instance=newSingleton();
}
}
returninstance;
}
}
在Flex中,您可以使用`ModelLocator`类来实现单例模式,该模式在内部创建自己的Completes实例化。
JavaScript
PackageModel
{
importflash.events.EventDispatcher;
importmx.collections.ArrayCollection;
importvo.articlesVO;
importvo.linksVO;
[可绑定]
publicclassModelLocatorextendsEventDispatch呃
publicstaticvar_instance:ModelLocator;
publicstaticfunctiongetInstance():ModelLocator{
if(_instance==null){
_instance=newModelLocator();
}
return_instance;
}
}
C#中的单例该模式的实现类似,例如确保唯一性并提供全球访问点。
csharp
//使用说明
//确保一个类只有一个实例,并提供全局访问点来访问它
//实现点
//单例模式限制而不是改进类的创建。
//单例类中的实例构造函数可以设置为protected,以允许子类继承它。
//单例模式一般不支持Icloneable接口,因为这会导致多个对象实例,这与单例模式的初衷相悖。
//单例模式一般不支持序列化,这会导致对象实例有多个,这也违背了单例模式的初衷。
//Singleton只考虑对象创建的管理,不考虑销毁的管理。
在支持垃圾收集和对象开销的平台上下文中,我们通常不需要对其销毁进行特殊管理。
//理解和扩展Singleton模式的核心是“如何使用new处理任意用户对类的构造函数的调用”。
//您可以轻松地修改某些实例的单例,这是允许的并且是有意义的。
//优点
//实例控制:单例会阻止其他对象实例化自己的单例对象副本,从而保证所有对象都可以访问单个实例。
//灵活性:因为类的实例化过程是受控的这样类可以更灵活地修改实例化过程。
//缺点
//开销:虽然数量很少,但是如果每次对象请求引用时是否都要检查如果每次都存在该类的实例,仍然需要一些开销。
这个问题可以通过使用静态初始化来解决。
//潜在的开发困惑:使用单例对象时,开发者应该记住不能使用new关键字实例化对象。
由于库源代码可能无法访问,应用程序开发人员可能会意外地发现自己无法直接实例化此类。
//对象生存期:单例无法解决删除单个对象的问题。
单例模式广泛应用于各种场景,例如确保系统中只有一个窗口管理器、打印机或COM端口实例。
单例模式是一种常用的软件设计模式。
它的基本结构仅由一个称为Singleton类的特殊类组成。
单例模式可以保证系统中某个类只有一个实例,并且该实例易于外界访问,从而便于控制实例数量,节省系统资源。
如果您希望系统中只存在某个类的一个对象,那么单例模式是最好的解决方案。
什么叫单例模式,如何实现,有什么作用?
只有一个实例,最简单的单例模式可以使用static来实现。例如,以下_Context变量使用单利模式。
下面的代码是,当外界想要调用_Context时,如果_Context已经实例化,则直接返回。
全局只有一个_Context,如publicclassEESGateway{privatestaticEESDatabaseDataContext_Context=null;//EESDatabasDataContexInstanceprivateconststringdatabaseName='EESDatabase';//DatabaseName///
什么是单例模式,举例说明?
定义:Singleton模式的主要功能是确保Java应用程序中只存在一个类的一个实例。许多操作,例如建立目录数据库连接,都需要这种单线程操作。
此外,单例可以是有状态的;这样,多个单例类就可以充当状态的仓库,对外提供服务。
例如,如果您想要在论坛中设置发帖计数器,则需要在每次浏览时进行计数。
单例类是否可以保留这个计数并安全地同步它并自动将其加1如果你想将这个数字永久保存在数据库中,在不改变单态接口的情况下可以轻松做到吗?另一方面,Singleton也可以变成无状态的。
通过提供类似工具的功能,单例模式为我们提供了这样的实现的可能性。
使用Singleton的好处是可以节省内存,因为它限制了实例的数量并促进了Java垃圾收集(garbagecollection)。
我们经常看到工厂模式中的类加载器也是在单例模式中实现的,因为加载的类实际上是资源。
如何使用?一般的Singleton模式通常有以下几种形式:publicclassSingleton{PrivateSingleton(){}//内部定义一个自己的实例是不是很奇怪?//注意,这是私有的,仅用于内部调用privatestaticSingletoninstance=newSingleton();//这里是外部访问该类的静态方法,可以直接访问publicstaticSingletongetInstance(){returninstance;}}两种形式:publicclassSingleton{privatestaticSingletoninstance=null;publicstaticsynchronizedSingletongetInstance(){//该方法比前一种方法有所改进。
不需要每次都生成对象,//使用时生成实例,提高了效率。
if(instance==null)instance=newSingleton();返回实例;可以使用Singleton.getInstance()访问Singleton类。
上面的第二种形式是惰性初始化,也就是说Singleton在第一次调用时就被初始化了,以后不需要再次生成。
注意lazyinitialization模块中的同步。
这种同步非常重要。
如果没有同步,可以使用getInstance()获取多个单例实例。
关于惰性初始化单例的双重检查锁(DCL)有很多讨论,感兴趣的可以进一步研究。
通常认为第一种形式更安全。
使用Singleton的注意事项:有时候,在某些情况下,使用Singleton并不能达到Singleton的目的。
例如,多个Singleton对象被不同的类加载器同时加载;在EJB这样的分布式系统中使用时也需要注意这一点。
这种情况是由于EJB是跨服务器、跨JVM的。
我们以SUN宠物商店源代码(PetStore1.3.1)的ServiceLocator为例:PetStore中有两种ServiceLocator,一种在EJB目录中,一种在WEB目录中;这两个ServiceLocator,我们会发现内容几乎是一样的,都提供EJB查询和本地化服务,但是为什么要分开呢?仔细研究了这两类ServiceLocator,我发现了区别:WEB中的ServiceLocator采用的是Singleton模式。
ServiceLocator属于资源放置,所以当然应该使用Singleton模式。
但在EJB中Singleton模式已经失去了作用,所以ServiceLocator分为两种,一种为一个为WEB服务,另一个为EJB服务。
单例模式看起来简单,使用起来也很方便,但是用好它并不容易。
它需要对Java类线程内存等概念有相当多的了解。