在1.5版本之前可以两种实现Singleton的方法,但是都要把构造器保存为私有的。
1、公有静态成员是个final域
-
-
publicclassElvis
{
-
publicstaticfinalElvis
INSTANCE =newElvis();
-
privateElvis()
{ }
-
-
publicvoidleaveTheBuilding()
{
-
System.out.println("Whoa
baby, I'm outta here!");
-
}
-
-
-
publicstaticvoidmain(String[]
args) {
-
Elvis
elvis = Elvis.INSTANCE;
-
elvis.leaveTheBuilding();
-
}
-
}
问题:但是客户端可以通过AccessibleObject.setAccessible方法,通过反射机制调用私有构造器。
AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。
2、公有的成员是个静态工厂方法
这种方法很清晰的表明了这个类是一个Singleton
-
-
-
publicclassElvis
{
-
privatestaticfinalElvis
INSTANCE =newElvis();
-
privateElvis()
{ }
-
publicstaticElvis
getInstance() {returnINSTANCE;
}
-
-
publicvoidleaveTheBuilding()
{
-
System.out.println("Whoa
baby, I'm outta here!");
-
}
-
-
-
publicstaticvoidmain(String[]
args) {
-
Elvis
elvis = Elvis.getInstance();
-
elvis.leaveTheBuilding();
-
}
-
}
问题:同上
3、实现Singleton类变成可序列化的,紧紧实现序列化是不够的,为了维护并保证Singleton,必须声明所有实例域都是瞬时(transient)的,并提供一个readResolve方法。否则,每次反序列化一个序列的实例时,都会创建一个新的实例。
《The readResolve Method -- 序列化实现readResolve方法的作用》http://blog.csdn.net/partner4java/article/details/7058741
-
importjava.io.Serializable;
-
-
-
publicclassElvisimplementsSerializable{
-
publicstaticfinalElvis
INSTANCE =newElvis();
-
privateElvis()
{ }
-
-
publicvoidleaveTheBuilding()
{
-
System.out.println("Whoa
baby, I'm outta here!");
-
}
-
-
privateObject
readResolve() {
-
-
-
returnINSTANCE;
-
}
-
-
-
publicstaticvoidmain(String[]
args) {
-
Elvis
elvis = Elvis.INSTANCE;
-
elvis.leaveTheBuilding();
-
}
-
}
4、从JDK 1.5开始,实现Singleton,可以编写一个包含单个元素的枚举类型。
而且可以解决复杂的反序列化或者反射的攻击。
单元素的枚举类型已经成为实现Singleton的最佳方法。
-
-
publicenumElvis
{
-
INSTANCE;
-
-
publicvoidleaveTheBuilding()
{
-
System.out.println("Whoa
baby, I'm outta here!");
-
}
-
-
-
publicstaticvoidmain(String[]
args) {
-
Elvis
elvis = Elvis.INSTANCE;
-
elvis.leaveTheBuilding();
-
}
-
}
分享到:
相关推荐
Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中...
3、有构造函数,构造函数有没有参数版本(DEFINE_SINGLETON_CONSTRUCT_WITH_DEFAULT); 4、有构造函数,构造函数都有参数(DEFINE_SINGLETON_CONSTRUCT); 通过宏定义巧妙实现,使用也很方便!
C++完美实现Singleton模式
简单的单例模式举例Singleton 分为恶汉式 懒汉式
从loki库中提取的,并加入了测试程序,工程环境vs2008
单例模式(Singleton)
单例模式 Singleton 单例模式线程安全问题和拓展
李建忠面向对象设计模式视频精讲:Singleton 单件(创建型模式)
用VC实现的singleton 模式 在VS03,VC6.0下编译通过
单例模式,Singleton两种代码实现。一般实现方法,泛型实现方法(推荐)
Singleton pattern单例模式应用
Laravel开发-singleton-pattern 帮助程序包来实现单例类。
在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
参考文档:电梯直达 ... /// 私有构造函数 EventBus._internal(); /// 保存单例 static EventBus _singleton = new EventBus._internal(); /// 工厂构造函数 factory EventBus() => _singleton; /// 保
singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.
Android Singleton单例模式运用详解
singleton pattern 的定义 主要应用方法 优缺点 通过代码 具体分析解释
java singleton 不解释不解释不解释不解释
Android4.0的科学计算器源码工程。 具体参见:http://blog.csdn.net/singleton1900/article/details/8466084