`
fruwei
  • 浏览: 14296 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

设计模式一 单例模式

阅读更多
单例模式是一个很常用的创造型模式,其主要目的是控制生成对象的唯一性。在java中实例化对象的方法主要通过new(还有反射、clone等,本篇不讨论)。为了限制new方法的使用,首先要将单例类的构造函数设置为private,如此客户端就无法直接调用构造函数来new对象了。
   下图是单例模式的一个简单类图:

通过静态方法getInstance获取对象实例,一种方式是通过static初始化模块来实例化这个单例对象,这种方式在该类被加载时实例,由于类的初始化过程是唯一的所以这种单例模式也是线程安全的。
public class OneClass {
	private static OneClass instance=new OneClass();
	private OneClass(){
		
	}
	public static OneClass getInstance(){
		return instance;
	}
	public void func(){
		System.out.println(this.toString());
	}
	
	public static void main(String args[]){
		OneClass one=OneClass.getInstance();
		one.func();
	}
}

另外一种方式在第一次获取getInsatnce时进行实例化,这种方式明显在多线程情况下需要对getInstance进行加锁控制。下面这段代码是未对getInstance进行加锁,由于构造函数的2秒暂停,可以发现最终结果子线程和main线程打印出的对象id是不同的。解决的方法很简单对getInstance方法添加synchronized关键字即可。
public class OneClass {
	private static OneClass instance=null;
	private OneClass(){
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	public  static OneClass getInstance(){
		if(instance==null){
			instance=new OneClass();
		}
		return instance;
	}
	public void func(){
		System.out.println(this.toString());
	}

	public static void main(String args[]){
		new Thread(new Runnable(){
			public void run() {
				OneClass two=OneClass.getInstance();
				two.func();
			}
		}).start();;
		OneClass one=OneClass.getInstance();
		one.func();
	}
}


当然也可以将锁移动到内部具体实例化的代码段,来缩小加锁区域,其中需要额外注意的是在获取到锁之后需要再次判断下instance引用是否为空(因为线程获得到锁之后会继续执行下去):
	public  static OneClass getInstance(){
		if(instance==null){
			synchronized(OneClass.class){
				if(instance==null){
					instance=new OneClass();
				}
			}
		}
		return instance;
	}

最后给出一种最简洁的写法,通过内部类来获取单例,由于内部类在调用getInstance的时候才会被初始化,因此达到懒汉模式:
public class OneClassBest {
	private OneClassBest(){
	}
	private static class ClassHandle{
		private  static OneClassBest oneInstace=new OneClassBest();
	}
	public   static OneClassBest getInstance(){
		return ClassHandle.oneInstace;
	}
}
  • 大小: 7 KB
分享到:
评论

相关推荐

    C++单例设计模式,单例模式

    C++单例设计模式,单例模式 C++单例设计模式,单例模式

    设计模式单例模式和工厂模式综合应用

    "设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...

    C++设计模式-单例模式

    李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。

    设计模式——单例模式

    单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于控制共享资源,如数据库连接池、线程池或者日志系统等,确保这些资源在整个应用程序中只被创建一次。 单例模式的核心...

    设计模式之单例模式(结合工厂模式)

    单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...

    23钟设计模式之单例模式

    单例模式是一种常用的设计模式,它的核心思想是在整个应用程序中,一个类只能有一个实例存在。单例模式常用于控制资源的共享,例如数据库连接池、日志服务等。单例模式有多种实现方式,常见的包括懒汉式、饿汉式以及...

    设计模式之单例模式.pptx

    单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 比如在某个服务器程序中,该服务器的配置信息存放...

    设计模式-单例模式脑图

    设计模式-单例模式脑图

    设计模式之单例模式Java实现和类设计图

    单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于控制资源的共享,如数据库连接、线程池或配置对象等。在Java中,实现单例模式有多种方法,包括懒汉式...

    设计模式之单例模式和工厂模式

    细心整合和单例模式和工厂模式的几种模型,懒汉式,饿汉式,如何并发操作模式,等都有详细讲解

    设计模式-单例模式

    单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池或者配置管理等。 在Java中...

    python 设计模式之单例模式

    python 设计模式之单例模式

    Java设计模式之单例模式的七种写法

    单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常被设计成单例。这些应用都或多或少...

    Java设计模式之单例模式

    目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...

    javaweb项目+设计模式(单例模式,工厂模式,动态代理,适配器)

    单例模式是一种限制类实例化次数为一个的设计模式,常用于全局共享对象,如数据库连接池、线程池等。在Java中实现单例模式有多种方法,包括懒汉式(线程不安全)、饿汉式(线程安全)、双重检查锁定(DCL,线程安全...

    设计模式之单例模式源码demo

    单例模式是软件设计模式中的经典模式之一,其主要目的是控制类的实例化过程,确保在应用程序的整个生命周期中,某个类只有一个实例存在。这样的设计通常适用于那些需要频繁创建和销毁,但资源消耗较大的对象,如...

    Java设计模式之单例模式讲解

    入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免...

    Java设计模式-单例模式详解

    单例模式是 Java 设计模式中的一种常用的设计模式,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的是为了保证在一个进程中,某个类有且仅有一个实例。 实现单例模式的步骤: 1. 只有 ...

    一例读懂设计模式-单例模式、简单工厂模式.zip

    本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...

    设计模式总结-模板设计模式,单例模式(singleTon)

    ### 设计模式总结:模板设计模式与单例模式 #### 模板设计模式 模板设计模式是一种行为型设计模式,它定义了一个算法的骨架,并允许子类为算法的某些步骤提供具体的实现。通过这种方式,算法的基本流程保持不变,...

Global site tag (gtag.js) - Google Analytics