单例模式(Simpleton Pattern)

单例模式是开发中最常用的设计模式之一,它提供了创建对象的一种最佳方式,属于创建型模式。

单例特性:

1、单例类只能有一个实例。

2、单例类通过自己创建唯一实例。

3、单例类为其他对象提供这个唯一实例。

单例类实现:

1、构造函数私有化,禁止外部程序实例化对象。

2、提供一个私有静态的本类引用。

3、提供一个接口,供外部获取这个唯一实例对象。

使用单例类的目的:保证一个类仅有一个实例

Java代码实现:

Singleton.java(懒汉式,线程不安全)

public class Singleton{
	private static Singleton s;
	private Singleton(){
	
	}
	public static Singleton getInstance(){
		
		if(s==null){
			s = new Singleton();
		}
		return s;
	}
	
}
(需要说明的是以上类的实现是线程不安全的,叫做懒汉式实现)

Singleton.java(饿汉式,线程安全)

public class Singleton {  
    private static Singleton s = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
   	 return s;  
    }  
}  

(这种实现叫做饿汉式,由于在类中直接创建了对象,是线程安全的且实现简单)

Singleton.java(双重校验锁)

public class Singleton {
	private volatile static Singleton s;
	private Singleton(){}

	public static Singleton getInstance(){
		if(s == null){
			synchronized (Singleton.class){
				if(s == null){
					s = new Singleton();
				}
			}
		}
		return s;
	}
}
这种实现方式 俗称双重检查锁定,线程安全。



TestSingleton.java(测试程序)

import java.util.*;
import java.lang.*;

public class TestSingleton{
	
	public static void main(String []args){

		Singleton s = Singleton.getInstance();
		if(s!=null){
			System.out.println(s);
		}
		Singleton s1 = Singleton.getInstance();
		if(s1!=null){
			System.out.println(s1);
		}

		if(s1==s){
			System.out.println("yes");
		}else{
			System.out.println("no");
		}
	}
	
}
C++代码实现:

#include <iostream>

class Singleton
{
	private:
		static Singleton* s; //静态引用
		Singleton(){	}  //构造函数私有化
	public:
		static Singleton* getInstance(); //提供外部获取实例函数
};
//private static data member init 
Singleton* Singleton::s=nullptr;   //静态变量初始化
//public static function member implement
Singleton* Singleton::getInstance()  //外部获取实例函数具体实现
{
	if(s==nullptr)
	{
		s = new Singleton();
	}
	return s;
}


int main()  //主函数(测试)
{
	Singleton* s = Singleton::getInstance();
	if(s!=nullptr)
	{
		std::cout<<s<<"\n";
	}
	Singleton* s1 = Singleton::getInstance();
	if(s!=nullptr)
	{
		std::cout<<s1<<"\n";
	}
	
	if(s==s1)
	{
		std::cout<<"yes"<<std::endl;
	}
	else
	{
		std::cout<<"No"<<std::endl;
	}
	return 0;
}
由于每次获取的实例对象是同一个,所以s==s1。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值