Singleton pattern's best practice,see below:
[url]http://a123159521.iteye.com/blog/689087
[/url]
Singleton with public final field
public class Elvis{
public satic final Elvis instance = null;
private Elvis(){}
public static Elvis getInstance(){
if (instance == null) {
instance = new Singleton1();
}
}
public void leave(){...}
}
this personal construction is called for once that instance
the public static final field Elvis.INSTANCE.
Singleton with static factory
public class Elvis{
private static final Elvis INSTANCE = new Elvis()
private Elvis(){...}
public static Elvis getInstance(){ return INSTANCE;}
public void leave(){...}
}
as Serializable, the Singleton Object can't be easily add "implements Serializable", we shouled be declare all fields in transient, and provider readResolve method, or every time serializable will be create new instance.
public class Elvis{
private Object readResolve(){
return INSTANCE;
}
}
since jdk 1.5, you can use single enum type.
public enum Elvis{
INSTANCE;
public void leave(){...}
}
that's cool, and this will be provider serializable for free.
and this is the best singleton practice.
there is a risk in above two implements except enum.
first: with multiple thread, the second is ok, cause is it is instance after class loader, but the first one has a problem.
should be change below:
public static Singleton1 getInstance() {
if (instance == null) {
synchronized (Singleton1.class) {
if (instance == null) {
instance = new Singleton1();
}
}
}
return instance;
}
you can call getInstance() return Object, if the Object is the same,and there hashcode must be same.
you may be think this is singleton well, there is an other bug.
there is a special client can call setAccessible(true) to reflect the private construct, so there will be exist two singleton object.
public static void main(String[] args) throws Exception {
Class<Singleton2> clazz = Singleton2.class;
Constructor<?>[] cons = clazz.getDeclaredConstructors();
Constructor<?> con = cons[0];
con.setAccessible(true);
Singleton2 s1 = (Singleton2) con.newInstance(null);
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
modified as below:
public class Singleton2 {
private static final Singleton2 INSTANCE = new Singleton2();
private Singleton2() {
if(INSTANCE != null){
throw new UnsupportedOperationException("Singleton Object");
}
}
public static Singleton2 getInstance() {
return INSTANCE;
}
}
that's well, in same classLoader, there must be singleton.
as multipe ClassLoader, there should be exist difference Objects.
this is needn't to sync, because this is skip the singleton's area
分享到:
相关推荐
singleton pattern 的定义 主要应用方法 优缺点 通过代码 具体分析解释
### Singleton Pattern 单例模式应用详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的...
在Go语言中,实现单例模式(Singleton Pattern)通常涉及确保一个类只有一个实例,并提供一个全局访问点来获取该实例。由于Go语言没有传统的类和对象概念,但具有结构体(struct)和函数,我们可以通过使用包级变量...
Singleton Pattern单例模式详解 Singleton Pattern单例模式是一种创建型设计模式,提供了一种创建对象的最佳方式。该模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建在应用程序运行...
### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...
单例模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制资源的唯一性、全局配置对象或者缓存服务等。本篇文章将深入探讨...
**单例模式(Singleton Pattern)**是软件设计模式中的一种基础模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接池等,这些都...
单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...
Java据说有23种设计模式,Android的设计模式肯定是由Java来引申出来的。这里不讨论有多少人全会,有多少种设计模式会使用到,我们来讲下其中用得最多的也就是人人都知道的...这里是一个简单的SingletonPatternDemo。
单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于需要全局共享资源的场景,比如配置管理、日志记录等。 单例模式的组成 私有构造函数:防止外部...
private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. 懒汉式(Lazy Initialization):在第一次需要时...
C#单例模式(Singleton Pattern)是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。下面我们将详细介绍C#单例模式的定义、实现和优化。 单例模式的定义: 单例模式的主要目的是确保一个...
本文以实例形式讲述了C#单例模式(Singleton Pattern)的实现方法,分享给大家供大家参考。具体实现方法如下: 一般来说,当从应用程序全局的角度来看,如果只允许类的一个实例产生,就可以考虑单例模式。 1.即时加载...
设计模式 - Singleton Pattern 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。这就是 Singleton Pattern 的设计动机。 Singleton ...
单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...
private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` ...
private static final Singleton1 instance = new Singleton1(); private Singleton1() {} public static Singleton1 getInstance() { return instance; } } ``` - 静态代码块方式: ```java public class...
3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板...
在`singleton-pattern-master`这个压缩包中,可能包含了一个示例项目或者一个库,它演示了如何在Laravel中实现和使用单例模式。可能的目录结构包括源代码文件、配置文件、示例测试等,帮助开发者更好地理解和应用...
备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...