`
come_for_dream
  • 浏览: 116817 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式之单例模式三(更好的实现方式)

阅读更多

          大学之道,在明明德,在亲民,在止于至善。 《礼记  大学》

       

 今天考完了安卓这门课,100分钟的考试50分钟就交卷离开考场了吻吻吻吻,回想一下大学生活就这么没了,虽然小菜现在还是大三但是大四学校安排是实习到下年四月份,学校里面已经没有了课程。想想自己的青春就这么没了,也是有点伤感呢。。最近在看《研读设计模式》这本书感觉写的很不错,通俗易懂哈。

         之前写过懒汉式单例模式在多线程环境下,会造成不只创建出一个实例的问题,下面是提出的几种解决方式以及他们分别出现的问题:

  1.  使用双重检验锁;   问题:JVM为了使得处理器内部的运算单元能充分利用,处理器可能会对输入代码进行乱序执行
  2. 在双重检验锁的基础上给对象加volatile修饰用来解决乱序执行的问题。问题:volatile关键字可能会屏蔽掉虚拟机中一些必要的代码优化,所以运行效率不会很高。所以在项目开发中这种方式也不要大量使用。

    那么既然上面的解决方式都有一些小小的瑕疵,那么还有什么比较合适的方式呢?

其中的一种方式就是使用类级静态内部类。第二种方式就是使用使用枚举类型。

    在多线程中,为了解决并发问题,我们主要是使用synchronized来加互斥锁进行同步。有些时候我们的jvm默认的已经为我们解决了多线程情况下的并发问题。其中包括:

  1. 静态初始化器初始化静态字段,代码块的时候
  2. 访问final字段的时候

采用静态初始化器初始化对象,这种方式很好理解,比如jvm在加载一个类时对其静态属性进行初始化的过程就是线程安全的,比如饿汉式单例模式中就使用的这种方式初始化对象的。但是这种方式是比较消耗资源的,因为它不管我们使不使用这个对象在加载类的时候它都会被创建出来从而占用一些不必要的内存。我们可以去假设一种方式让静态初始化器在装载类的时候不去初始化对象。

我们其实可以使用类级静态内部类的方式解决这个问题,为了更好的说明这个问题,我们先看下面这个例子

public class SingleIntance {

	private static class SingleHandler {
		private static SingleIntance singleIntance = new SingleIntance();
	}

	public void doSpeak() {
		System.out.println("I am a coder");
	}

	private SingleIntance() {

	}

	public static SingleIntance getSingleInstance() {
		return SingleHandler.singleIntance;
	}

	public static void main(String[] args) {
		SingleIntance intance = SingleIntance.getSingleInstance();
		intance.doSpeak();
	}
}

 这是这本书上给出的方案,我仔细揣摩感觉这种方式非常不错,也希望和大家分享一下这种方式。首先分析一下这种方式:SingleIntance这个类在进行装载的时候并不会装载SingleHandler这个静态内部类,当我们在第一次调用getSingleInstance这个方法的时候。SingleHandler.singleIntance这行代码会让虚拟机加载SingleHandler 这个内部类,并初始化其静态属性,虚拟机只会对一个类初始化一次,所以这样虚拟机就保证了单例对象只被初始化一次。这种方式的好处就是getSingleInstance并没有被同步,对其进行延迟加载并没有带来任何的访问成本,效率大大增强。

 

       第二种方式就是使用枚举来实现单例模式,按书中的说法《高效java第二版》中说道:单元素的枚举类型已经成为实现SingleIntance的最佳方式。java中的枚举类型启示是功能齐全的类可以有字段和方法,以前小菜只用到了枚举中的属性,方法并没有用到。看来好多知识都需要再补补了。java枚举类型的基本思想是通过共有的静态final域为每个枚举常量导出实例的类。下面看一个非常简单的例子:

public enum EnumSingleInstance {

	/**
	 * 定义枚举元素,该元素就是一个单例的对象
	 */
	singleInstance;
	
	public void doSpeak(){
		System.out.println("I am a single object");
	}
	
	public static void main(String[] args) {
		EnumSingleInstance instance=EnumSingleInstance.singleInstance;
		instance.doSpeak();
	}
}

 

 由以上代码可以看到用枚举来控制单实例的方式比其他方式会便捷很多,而且还无偿的提供了序列化的支持,由JVM保证只有一个实例,防止有多个实例。

 

 

现在是凌晨1:26好晚了,洗洗睡了。

 

 

 

 

 

 

 

27
13
分享到:
评论

相关推荐

    java设计模式

    24.4.4 封装得更好一点 24.5 最佳实践 第25章 访问者模式 25.1 员工的隐私何在? 25.2 访问者模式的定义 25.3 访问者模式的应用 25.3.1 访问者模式的优点 25.3.2 访问者模式的缺点 25.3.3 访问者模式的应用 25.4 ...

    23种设计模式知识要点.zip

    代码示例:给出了一个简单的代码示例,帮助读者更好地理解该设计模式的具体实现方式。 23种常用设计模式:这份学习资料包含了23种常用的设计模式,包括单例模式、工厂模式、观察者模式、代理模式等等。这些设计模式...

    举例讲解C#编程中对设计模式中的单例模式的运用

    为了帮助大家更好地理解单例模式,大家可以结合下面的类图来进行理解,以及后面也会剖析单例模式的实现思路: 为什么会有单例模式 看完单例模式的介绍,自然大家都会有这样一个疑问——为什么要有单例模式的?它在什么...

    深入浅出java设计模式(高清中文PDF)

    文件类型为PDF文件,此文档对20多种java设计模式进行了详细讲解,在中文讲解的过程中还附有代码示例给学习者进行参考,使学习者通过实践更容易理解设计模式的原理。 本文档目录: 1.工厂模式 2.单例模式 3.建造...

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    设计模式提供了一套通用的解决方案,可以帮助开发人员更好地组织和设计代码,提高代码的可读性、可维护性和可扩展性。 设计模式可以分为三类:创建型模式、结构型模式和行为型模式。 1. 创建型模式:创建型模式关注...

    Java单例模式实现

    我认为单例设计模式可以帮助我们更好的管理项目中的某些资源问题。 饿汉式 静态成员变量 我们利用Java关键字static特性,在类初始化就被加载,并在以后的加载中不再加载。 /** * 饿汉模式,静态成员变量 * * @...

    单例模式demo

    饿汉式单例模式,挺简单的一个demo,希望可以帮助大家更好的理解

    Ruby设计模式(中文版+英文版).pdf

    本书以通俗易懂的方式介绍了Ruby设计模式,主要包括Ruby概述、使用模板方法变换算法、使用策略替换算法、通过观察器保持协调、通过迭代器遍历集合、使用命令模式完成任务、使用适配器填补空隙、使用装饰器改善对象、...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    全书给出了大量的练习,作为对读者的挑战,以启发思考,督促读者通过实践练习的方式来掌握设计模式。同时,作者又给出了这些练习的参考答案,使读者可以印证比较,找出自己的不足,提高设计技能。 《java设计模式(第...

    使用设计模式实现的花店订购系统,前端用javaswing

    通过工厂类创建对象,将对象的实例化过程和客户端代码分离,提供了更好的灵活性和可扩展性。为了实现对象之间的松耦合和事件通知,我们采用了观察者模式。对象之间的一对多依赖关系通过观察者模式得到解耦,并且当...

    1.什么是设计模式? 2.设计模式是指在软件开发中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案 3.说出

    8.由于外部调用和内部实现被接口隔离开了,那么只要接口不变,内部实现的变化就不会影响到外部应用,从而使得系统更灵活,具有更好的扩展性和可维护性 9.什么是OOP?OOP有什么特性?使用OOP用什么好处? 10.oop 是...

    C#23种设计模式_示例源代码及PDF

    单例模式: 而且自行实例化并向整个系统提供这个实 单例模式 单例模式确保某一个类只有一个实例, 例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 结构型模式 6、ADAPTER —在朋友聚会上碰到...

    23种JAVA设计模式和15种J2EE设计模式

    java的 23中设计模式,帮助你更好的规划代码,思路更清晰,装逼必备,可能不需要全部会用,但是有几个还是必须会的 ,像单例,代理,工厂,策略等等。还有j2ee的15中设计模式,对你会有很大的帮助

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

    GoF 的《设计模式》是所有面向对象语言(C++ Java C#)的基础,只不过不同的语言将之实现得更方便地使用。 GOF 的设计模式是一座"桥" 就 Java 语言体系来说,GOF 的设计模式是 Java 基础知识和 J2EE 框架知识之间一...

    顶级架构师手把手操刀设计实战-视频教程网盘链接提取码下载 .txt

    了解设计模式的原理和应用场景,可以帮助开发人员更好地设计和实现代码。 框架源码的研究可以帮助开发人员深入了解框架的实现原理和机制,从而更好地利用框架的功能和特性。同时,深入研究框架源码也有助于开发人员...

    23种设计模式.txt

    创建型模式  1、FACTORY—追MM少不了请吃饭了,麦当劳... 单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义.doc

    多线程的知识点讲解,,,线程安全,线程同步,,等待唤醒机制,单例设计模式,,,,,,,,,让你更好理解多线程

    Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)

    主要介绍了Unity通用泛型单例设计模式,分为普通型和继承MonoBehaviour,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

    python 实现单例模式的5种方法

    主要介绍了python 实现单例模式的5种方法,帮助大家更好的理解和学习python 设计模式,感兴趣的朋友可以了解下

Global site tag (gtag.js) - Google Analytics