【设计模式笔录】—单例模式剖析(一)

本文介绍了单例模式的概念及其在Java中的三种实现方式:饿汉式、懒汉式及利用Map缓存实例。单例模式保证了类只有一个实例,并提供了全局访问点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       在软件系统中,经常有这样一些类,必须保证它们在系统中只有一个实例,才能确保它们的逻辑正确性,以及良好的效率。如何绕过常规的构造器(如new),提供一种机制来保证一个类只有一个实例,这就需要使用单例模式类实现。

      通常,我们在实例化一个类的时候,使用new关键字,如:

     

Person person = new Person;

 

      这样我们是站在使用者的角度来创建一个类的实例,而对于单例模式,创建一个类的实例是类设计者的责任,而不是类使用者的责任。

      单例模式在《设计模式》GoF中的定义是:保证一个类只有一个实例,并提供一个该实例的全局访问点。设计一个类为单例,其类图如下:

    Java中单例模式的三种实现方式如下

 

    方式一:饿汉式

   

public class Singleton {
	private static Singleton instance = new Singleton();

	private Singleton() {
	};

	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

 

   方式二:懒汉式

  

public class Singleton2 {
	private static Singleton2 instance = null;

	private Singleton2() {
	};

	static {
		instance = new Singleton2();
	}

	public static Singleton2 getInstance() {
		if (instance == null) {
			instance = new Singleton2();
		}
		return instance;
	}
}

 

  方式三:

  

import java.util.HashMap;
import java.util.Map;

public class Singleton3 {
	private static Map<String, Singleton3> map = new HashMap<String, Singleton3>();
	static {
		Singleton3 singleton = new Singleton3();
		map.put(Singleton3.class.getName(), singleton);
	}

	protected Singleton3() {
	}

	public static synchronized Singleton3 getInstance(String name) {
		if (name == null) {
			name = Singleton3.class.getName();
			System.out.println("name=null" + "--->name=" + name);
		}
		if (map.get(name) == null) {
			try {
				map.put(name, (Singleton3) Class.forName(name).newInstance());
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
		return map.get(name);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值