单例模式

本文深入探讨了单例模式的概念及其实现方式,包括饿汉式、懒汉式和登记式单例三种类型,并通过示例代码展示了每种类型的特性。

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

单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例

单例的3个要素:
1)一个类只能有一个实例
2)必须自行创建
3)必须自行向这个系统提供这个实例
注意:构造子是私有的,不能被继承(登记式单例除外)

3种单例:
1)饿汉式单例
2)懒汉式单例
3)登记式单例

单例状态
有状态:通常的形式是:有属性,无方法,例如:计数器,状态库(reopsitory)
无状态:通常的形式是:有方法,无属性,例如:工具性函数对象

例子:
资源管理器
打印机
通信端口管理
系统属性文件(properties)
回收站

1)懒汉、饿汉式单例
Eager_Lazy.java

/**
* static 修饰的变量和代码区,只有在该类的静态方法或属性在第一次被访问的时候,才会初始化
* static final 修饰的变量,是在编译期间就会被初始化
* static final修饰的的对象或者变量,在加载类之前就存在
*/

// 饿汉式单例类.在类初始化时,已经自行实例化
class EagerSingleTon {
private static final EagerSingleTon instance = new EagerSingleTon();

private EagerSingleTon() {
}

public static EagerSingleTon getInstance() {
return instance;
}
}

// 懒汉式单例类,在第一次调用的时候被实例化
class LazySingleTon {
// 注意,这里没有final
private static LazySingleTon instance = null;

private LazySingleTon() {
}

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

2)登记式单例
RegSingleton.java
package CreationalPattern.Singleton;

import java.util.HashMap;
/*
目的:克服懒汉式和饿汉式单例不能集成的缺点而设计.
缺点1:父类构造子公开,可以不登记
缺点2:父类必须存在,才能有子类
*/
public class RegSingleton {
static private HashMap m_registry = new HashMap();
static {
RegSingleton x = new RegSingleton();
m_registry.put(x.getClass().getName(), x);
}

protected RegSingleton() {
}

static public RegSingleton getInstance(String name) {
if (name == null) {
name = "CreationalPattern.Singleton.RegSingleton";
}
if (m_registry.get(name) == null) {
try {
m_registry.put(name, Class.forName(name).newInstance());
} catch (Exception e) {
}
}
return (RegSingleton) (m_registry.get(name));
}

/**
* 示例方法
*/
public String about(){
return "this is RegSingleton.";
}
}

RegSingletonChild.java
package CreationalPattern.Singleton;

public class RegSingletonChild extends RegSingleton {
//必须公开
public RegSingletonChild() {
}

static public RegSingletonChild getInstance(){
//在父类里new的子类,所以子类的构造子必须是公开的
return (RegSingletonChild)(RegSingleton.getInstance("CreationalPattern.Singleton.RegSingletonChild"));
}

public String about(){
return "this is RegSingletonChild.";
}
}

TestSingleton.java
package CreationalPattern.Singleton;
public class TestSingleton {

public static void main(String[] args) {
TestSingleton t = new TestSingleton();
System.out.println(t.getClass().getName());
System.err.println("error!");

//4种调用登记式单例的方式
System.out.println(RegSingleton.getInstance("CreationalPattern.Singleton.RegSingleton").about());
System.out.println(RegSingleton.getInstance(null).about());
System.out.println(RegSingletonChild.getInstance().about());
System.out.println(RegSingletonChild.getInstance("CreationalPattern.Singleton.RegSingletonChild").about());
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值