设计模式-----单例(Singleton)模式

本文详细介绍了单例模式的概念,包括其保证一个类只有一个实例并提供全局访问点的核心特性。通过UML类图展示了单例模式的结构,并列举了五种Java实现单例模式的方法:饿汉式、懒汉式(线程不安全)、懒汉式(线程安全的同步方法)、静态内部类实现以及使用容器类管理单例。对比了各种实现的优缺点,如饿汉式的预加载和懒汉式的懒加载,以及静态内部类在保证单例的同时避免了同步开销。最后,通过代码示例展示了单例在多继承场景下的应用,强调了单例模式在实际开发中的重要性。

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

1.定义

单例模式:保证一个类只有一个实例,并且提供一个访问它的全局访问点。

2.UML类图

ea04e06e9f9671201a7e15f29eb55ee3.gif

3.代码实现

饿汉与懒汉的区别
前者在类装载时就实例化,后者只有在第一次被使用时才实例化。 (饿汉的优点是避免线程同步问题,缺点是即使没用到这个实例还是会加载) (懒汉的优点是实现了懒加载,但需要解决线程安全问题!)

1> 饿汉式,没有实现懒加载~

public class Singleton() {  
    private static Singleton instance = new Singleton();  
    private Singleton(){ }  
    public static Singleton getInstance() {   
        return instance;    
    }  
}  
//获取单例对象  
Singleton mSingleton = Singleton.getInstance();

 2> 懒汉,不加锁 线程非安全的

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

 3> 懒汉,加锁

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

 4> 静态内部类实现单例(推荐)

public class Singleton {  
    private Singleton() { }  
    private static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
    private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton()  
    }  
}

 5>容器类单例模式

public class SingletonManager {  
    private static Map<String,Object> objMap = new HashMap<String,Object>();  
    private Singleton(){ }  
    public static void registerService(String key,Object instance) {  
        if(!objMap.containsKey(key)) {  
            objMap.put(key,instance);  
        }  
    }  
    public static Object getService(String key) {  
        return objMap.get(key);  
    }  
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rKJ5rWu5LiA6aaZ6JWJ,size_20,color_FFFFFF,t_70,g_se,x_16

#include <iostream>
#include <string>
using namespace std;

class Singleton
{	
private:
	int i;
	static Singleton *instance;
	Singleton(int i)
	{
		this->i=i;
	}
public:
	static Singleton *getInstance()
	{
		return instance;
	}
	void show()
	{
		cout<<i<<endl;
	}
};
Singleton* Singleton::instance=new Singleton(8899); 

class A:public Singleton
{

};

int main()
{
	Singleton *s=Singleton::getInstance();
	Singleton *s2=A::getInstance();
	cout<<(s==s2)<<endl;
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉浮一湘蕉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值