`

单例模式容易忽略的几点

阅读更多

本文意在和谐讨论,高手勿喷~

 

单例模式容易忽略的几点:

1.第三种单例实现(除了懒汉和饿汉)

2.构造函数私有化(单例的核心)

3.即便构造函数私有化了也不能保证只有一个实例

 

下面我们来详细阐述:

1.第三种单例实现(除了懒汉和饿汉)

  1. 饿汉模式无论你是否会用到,上来都会创建实例。
  2. 懒汉模式只有在用到的时候才会创建,但是为了不产生多线程的问题,需要加synchronized来保证线程安全,但是每次使用的时候都需要带着保证线程安全的操作,无形增加了系统的开销.

于是使用第三种方式(内部类方式)来同时解决懒汉和恶汉的弊端

package com.cxy.singleton;

/**	内部类方式
 * @author cxy
 */
public class InnerClassSingleton {
	  
	//私有构造子  (保证整个系统只有一个实例)
	private InnerClassSingleton(){
		System.out.println("InnerClassSingleton 实例化");
	}  
	  
	//内部类
	private static class SingletonHolder {  
	    private static InnerClassSingleton instance = new InnerClassSingleton();
	}  
	
	public static InnerClassSingleton getInstance()
	{
		return SingletonHolder.instance;
	}
}

 

 

2.构造函数私有化(单例的核心)

为了保证整个系统只有一份实例,我们使用构造函数私有化的方式来保证,系统不会new出第二个实例。

 

3.即便构造函数私有化了也不能保证只有一个实例

 

其实即便构造函数私有化了,我们还是可以通过反射的方法来new出第二份实例的。

package com.cxy.singleton;

import java.lang.reflect.Constructor;

import org.junit.Test;

public class DestroyTest {
	
	@Test
	public void test() throws Exception
	{
		HungrySingleton obj1=HungrySingleton.getInstance();
		HungrySingleton obj2=HungrySingleton.getInstance();
		System.out.println("obj1和obj2是否相等:"+(obj1==obj2));
		
		System.out.println("=====================");
		//通过构造方法赋权限 让私有构造函数 可以实例化
		HungrySingleton obj3=null;
		HungrySingleton obj4=null;
		
		Constructor[] cons = Class.forName("com.cxy.singleton.HungrySingleton").getDeclaredConstructors();
		if(cons.length==1)
		{
			cons[0].setAccessible(true);
			obj3=(HungrySingleton)cons[0].newInstance();
			obj4=(HungrySingleton)cons[0].newInstance();
		}
		System.out.println("obj3和obj4是否相等:"+(obj3==obj4));
	}
}

 

如果你还知道有什么其他的关于单例"不为人知"的信息,欢迎指教讨论~

转载请保留原文地址!

4
1
分享到:
评论
5 楼 sealv 2014-05-22  
http://he91-com.iteye.com/blog/1894476
可以看下这个文章分析的更细
4 楼 snkcxy 2014-05-21  
kanme818 写道
反射new实例就是耍流氓,你都准备耍流氓了还谈什么模式。。。

耍流氓也是需要文化的,否则连怎么耍都不知道!
3 楼 kanme818 2014-05-21  
反射new实例就是耍流氓,你都准备耍流氓了还谈什么模式。。。
2 楼 shenyahui 2014-05-21  
其实单例还有一种实现方式,就是枚举。
1 楼 snkcxy 2014-05-21  
欢迎讨论~

相关推荐

    [ 设计模式速查手册 ]

    5. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。当需要一个全局唯一的实例,或者希望扩展单例的实现时,可以使用单例模式。 结构型设计模式关注如何组织类和对象的关系,使它们能够协同工作...

    23种设计模式.txt

    单例模式确保一个类只有一个实例,并提供一个全局访问点。 **应用场景:** - 控制资源的唯一实例,例如数据库连接池、线程池等。 **优点:** - 节省资源。 - 全局访问点。 **缺点:** - 违反了单一职责原则。 - ...

    二十三种设计模式【PDF版】

    设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...

    DELPHI包初学者小心的几点

    以下是对"DELPHI包初学者小心的几点"这一主题的详细说明,帮助新手避免这些常见问题。 1. **组件使用不当**:Delphi拥有丰富的组件库,如TButton、TLabel等,但初学者可能对组件的属性、方法和事件理解不透彻,导致...

    设计模式知识点(23种设计模式)

    设计模式知识点(23种设计模式) 设计模式是一种软件设计中常用的解决方案,旨在解决软件开发过程中遇到的各种问题,提高软件的可维护性、可扩展性和可重用性。这里总结了23种常用的设计模式,分为创建型模式、结构...

    23种设计模式 word 版

    - **定义**:为子系统中的一组接口提供一个一致的界面,`Facade`模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 - **适用场景**: - 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为...

    java模式-java中的所有模式-java进阶必备···

    单例模式(Singleton)** - **定义**:确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 - **实现方式**: - **饿汉式**:在类加载时就完成了初始化,所以类加载比较慢,但由于是静态常量,...

    浅谈JAVA软件开发的几大误区.pdf

    正确理解和适时应用设计模式,如单例模式、工厂模式和观察者模式,有助于提高代码质量。 此外,不重视文档编写和代码注释也是一个误区。良好的文档可以帮助团队成员更好地理解代码,提高协作效率。同时,代码注释...

    cpp设计模式mini版

    - 当一个类的实例只能有几个不同状态组合中的一种时,建立相应数量的原型并克隆它们可能比每次用合适的状态手动实例化该类更方便。 #### Singleton(单例) **结构意图**:保证一个类仅有一个实例,并提供一个访问...

    23设计模式

    - **意图**:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 - **适用性**: - 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断...

    多弹出框的屏蔽

    1. **单例模式**:为Dialog类实现单例模式,确保在整个应用中只存在一个实例。这样,每次试图打开新的Dialog时,都会检查是否已有打开的Dialog。如果有,新请求会被忽略或者堆叠等待。 2. **队列管理**:创建一个...

    阿里规范插件001.zip

    “Alibaba Java Coding Guidelines”涵盖了许多重要的编程实践,包括但不限于以下几点: 1. **命名规范**:此规范强调了类、接口、方法、变量等的命名应清晰明了,易于理解。例如,类名应使用驼峰式命名,常量全...

    php常见面试问题及答案

    单例模式是一种常用的软件设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在PHP中实现单例模式的一种方式是: - 将构造函数声明为私有(private),以防止外部创建类的实例。 - 提供一个静态...

    健身达人微信小程序的设计与实现ssm后端源码案例设计.zip

    3. 设计模式:在后端开发中,SSM框架通常会涉及到工厂模式(用于创建Service对象)、单例模式(Spring管理Bean默认为单例)、代理模式(MyBatis的动态代理实现SQL执行)等设计模式。 4. 数据库设计:为了支持健身...

    高质量C和C++编程指南

    7. **设计模式**:讨论一些常见的设计模式,如工厂模式、单例模式、观察者模式等,提升代码的可复用性和可维护性。 通过《高质量C和C++编程指南》,读者将能够掌握编写高质量C和C++代码的技巧和策略,避免常见的...

    深入浅出面向对象分析与设计【中文版】

    1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。 2. **工厂模式**:提供一个创建对象的接口,但让子类决定实例化哪个类。 3. **策略模式**:定义一系列算法,把它们一个个封装起来,并且使它们...

    java面向对象精华总结.doc

    - **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。这种模式经常用于创建系统配置管理器、日志记录器等需要唯一实例的场合。 单例模式的实现步骤: 1. 将类的构造函数设置为私有,以防止外部直接...

    .NET设计规范

    1. 单例模式:确保一个类只有一个实例,并提供全局访问点。这在配置管理、缓存或日志记录等场景中非常有用。 2. 工厂模式:提供创建对象的接口,但让子类决定实例化哪一个类。它封装了创建对象的过程,使得系统更加...

    华农08-11面向对象试卷及答案

    11. **设计模式**:设计模式是解决软件设计中常见问题的通用解决方案,如单例模式、工厂模式、观察者模式等,试卷可能考察学生对这些模式的理解和应用。 通过这些试卷,学习者可以检验自己对面向对象编程理论和实践...

Global site tag (gtag.js) - Google Analytics