`
苹果超人
  • 浏览: 200060 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

单件设计模式

阅读更多
  最近老是在研究设计模式,下面我想跟大家分享一下我心得,首先跟大家分享的是“单件模式”,顾名思义,“单件”就是指一个类的实例在整个系统中只有一个(也就是说只初始化一次)。那么它适用于什么场合呢?
  适用场合:在一个系统中,往往一些服务只需要它们在整个系统中存在一个实例,并在系统的任何角落都可以调用它。那么如何才能调用呢?很简单,只要在这个类中暴露一个接口给别人调用就OK了。
  好处:1.延迟加载。你只需在你要用到该类时,才加载该类。
  遇到的问题:1.多线程之间的安全问题。如果多个线程同时访问该类的话,可能会初始化多个该类的实例。所以我们这边要用java的同步机制(synchronized),来锁住初始化的那部分代码,确保该资源同一时间只能被一个线程访问。其实这样会影响性能的,比如第一次,一个线程占有了资源,在它未释放资源之前,如果有很多线程来访问,那么它们就必须等待。在这里我们可以采用double-checking的方式来提高一下性能。下面我来对照一下代码解释一下。
package com.kevin.test;

import java.util.ArrayList;
import java.util.List;

public class Singleton{
	
	private static Singleton instance;
	private static String flag;
	// initialize list
	private static List<String> arrayList = new ArrayList<String>();
	private static final Object lockObject = new Object();
	
	private Singleton(String flag){
		this.flag = flag;
		// initialize in constructor
		// arrayList = new ArrayList<String>();
	}
	
	public static Singleton getSingleton(String flag){
		// double-checking
		if(instance == null){
			synchronized (lockObject) {
				if(instance == null){
					instance = new Singleton(flag);
				}
			}	
		}
	      // not double-checking
//		synchronized (lockObject) {
//			if(instance == null){
//				instance = new Singleton(flag);
//			}
//		}
		return instance;
	}		
}

如果采用非double-checking的方式的话,如果第一个线程执行完成,释放了资源(也就是说实例已经初始化完成),但是以后的一个线程来访问时,进入锁后,其他要访问该资源的线程还需要需要等待,其实这时候我们已经知道该类的实例已经不为空了,所以我们采用double-checking的方式,当实例已经创建时,我们则不需要进入同步代码块,直接返回实体给该线程了,这样就大大提高了性能。
注意:单件模式的构造函数一定是私有的,为了不让外部区实例化它。
另外,想跟大家说一点,单件模式里面的该类的属性如果有arraylist,hashmap等等时,可以在声明的时候就初始化,或者在构造函数中初始化,如果你想操作这些集合,你需要保证他们的同步。
分享到:
评论

相关推荐

    设计模式 单件模式 设计模式 单件模式

    "设计模式-单件模式" 单件模式是指确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的程序设计方法。单件模式是一种非常实用的设计模式,它可以控制一个类的实例数量,使得调用者可以从...

    opencv单件设计模式

    在OpenCV中,单件设计模式可能被用来管理共享资源,如摄像头、图像缓存或者复杂的计算对象。这种模式确保了这些资源的唯一性和线程安全,特别是在多线程环境中,避免了资源的冲突和混乱。 具体到"ColorDetectMFC"这...

    1.单件设计模式.rar

    单件设计模式.rar"中,很可能包含了不同实现方式的示例代码,以及对各种实现的比较分析,如性能差异、内存占用等。通过学习这些案例,你可以更深入地理解C++中的单例设计模式,以及如何在实际项目中应用和优化。

    C#设计模式,单件模式,C#代码

    C#作为.NET框架的主要编程语言,广泛应用于各种复杂系统开发,其中单件模式(Singleton Pattern)是C#开发者经常会遇到的一种设计模式。本资源旨在帮助初学者理解并应用单件模式,通过关键代码实例,让你快速掌握这...

    设计模式\单件模式VS2005

    单件模式(Singleton Pattern)是软件设计模式中的一种经典模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接等需要全局唯一的...

    Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

    单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...

    设计模式 之 单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的核心意图是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,这样的设计模式能够有效地控制资源的使用,限制实例的数量,以及协调对象间的交互...

    设计模式之单件模式

    这份文档以例子的形式讲诉了设计模式之单件模式,希望可以帮助学习的人!

    深入浅出设计模式之单件模式

    ### 深入浅出设计模式之单件模式 #### 一、单件模式概述 单件模式(Singleton Pattern)是软件设计模式中最为常见的一种,它的主要目标是确保某个类只有一个实例,并提供一个全局访问点。单件模式在很多情况下都...

    设计模式_--_工厂模式和单件模式

    ### 设计模式——工厂模式与单例模式 #### 一、引言 设计模式是软件工程领域中的一个重要概念,它代表了在特定情况下解决常见问题的最佳实践。在本篇文章中,我们将深入探讨两种广泛使用的软件设计模式:工厂模式...

    [创建型模式] head first 设计模式之单件模式(Singleton)

    **单例模式(Singleton)**是软件设计模式中的一种创建型模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,例如管理共享资源、配置对象或者数据库连接等。单例...

    基于C#的设计模式中的单件模式

    单件模式(Singleton Pattern)是软件设计模式中的一种基础模式,它确保一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式的实现有多种方式,包括懒汉式、饿汉式以及线程安全的实现。下面我们将详细讨论...

    C++单件工厂模式

    用C++实现的单件工厂设计模式,运用到纯虚函数,继承,是学习工厂模式的好例子~~

    c++实现单件模式 c++实现单件模式 c++实现单件模式

    单件模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在软件开发中被广泛应用,比如配置管理、数据库连接池、日志服务等场景,需要确保全系统...

    面向对象设计模式:Singleton 单件(创建型模式)

    李建忠面向对象设计模式视频精讲:Singleton 单件(创建型模式)

    单件模式 实例 模式 很好的例子

    模式 很好的例子模式 很好的例子模式 很好的例子模式 很好的例子模式 很好的例子设计模式的一 种单件 模式 很好的例子

    C++设计模式课件12_Singleton_单件模式.pdf

    单件模式是软件设计模式中最为基础且应用广泛的一种模式。它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。此模式通常用于那些需要频繁创建、消耗大量资源的对象上,如数据库连接池等。 #### 一、...

    设计模式——单实例模式、单件模式——Java编写

    单实例模式是软件设计模式中的一种,它的核心思想是确保一个类在整个系统运行过程中只有一个实例存在,并提供一个全局访问点,以保证所有对该类对象的访问都指向这个唯一的实例。这种模式在Java中广泛应用于配置管理...

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    在C#编程中,面向对象设计模式是一种组织代码和解决常见设计问题的模板。Singleton模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种模式在需要控制资源的唯一...

Global site tag (gtag.js) - Google Analytics