今天来简单来说一下单例模式:它要确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
比如我们登录一个系统的时候要记录一个员工的信息,在整个系统运行过程中可能要不段的访问这个员工的信息,
一般情况下我们会有两种做法,第一种建一个静态类,第二种就是今天我要说的键一个单例类
今天只说单例类,建单例类要有几个要求
1.私有的构造方法
2.指向自己实例的私有静态引用
3.以自己为实例为返回值的静态方法
单例模式实例化对象有两种方式
1.懒汉模式:调用取得实例方法的时候才去实例化对象
public class singleClassDemo
{
private static singleClassDemo singleC;
private singleClassDemo()
{
}
private static singleClassDemo InitSingle()
{
if (singleC == null)
singleC = new singleClassDemo();
return singleC;
}
}
2.饿汉模式:单例类被加载时候实例化对象
public class singleClassDemo
{
private static singleClassDemo singleC = new singleClassDemo();
private singleClassDemo()
{
}
private static singleClassDemo InitSingle()
{
return singleC;
}
}
做一个小例子:保存员工的名字和ID
public class Program
{
static void Main(string[] args)
{
singleClass s1 = singleClass.getSingleClass();
singleClass s2 = singleClass.getSingleClass(); //已经实例化过一次了不会再实例化了
Console.ReadLine();
}
}
public class singleClass
{
private static singleClass singleC = new singleClass();
private singleClass()// 在整个程序运行过程中只实例化一次
{
id = "001";
name = "ERP";
Console.WriteLine("singleClass run");
}
public static singleClass getSingleClass()
{
return singleC;
}
private static string id;
public static string ID
{
get
{
return id;
}
}
private static string name;
public static string Name
{
get
{
return name;
}
}
}
c++代码


#pragma once #include<iostream> class SingleClassDemo { public: static SingleClassDemo * initSingleClass(); std::string getName(); private: explicit SingleClassDemo(); static SingleClassDemo * singleClass; std::string m_name; }; #include "stdafx.h" #include "singleClassDemo.h" #include <string> SingleClassDemo * SingleClassDemo::singleClass = nullptr; SingleClassDemo * SingleClassDemo::initSingleClass() { if (singleClass == nullptr) { singleClass = new SingleClassDemo(); } return singleClass; } std::string SingleClassDemo::getName() { if (m_name.empty()) { m_name = "boke"; } return m_name; } SingleClassDemo::SingleClassDemo() { } //main SingleClassDemo * s = SingleClassDemo::initSingleClass(); std::cout << s->getName(); std::cin.get();