单例模式是开发中最常用的设计模式之一,它提供了创建对象的一种最佳方式,属于创建型模式。
单例特性:
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;
}
}
这种实现方式
俗称双重检查锁定,线程安全。
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。