单例模式是常用的软件设计模式,包含一个被称为单例的特殊类。通过单例模式保证系统中一个类只有一个实例(对象),而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
定义一个单例类
因为只能有一个对象,所以在外界不能新创建对象,创建对象需要调用构造函数,可以将构造函数设为private或protected;
又因为有一个对象,将这个对象在类内部创建,用一个接口调用
因为外部无法创建对象调用,所以要设计成static类型,可以直接用类类型调用
class A
{
protected:A() { cout << "A" << endl; }A(const A&) = delete;//删拷贝构造
public:A& operator = (const A& a) = delete;//删赋值static A& fn()//对象调用接口{static A a;return a;}
};void main()
{A& b = A::fn();A& bb = A::fn();//b和bb是同一个对象// A* p = (A*)malloc(sizeof(A));// *p = b;
}
1.将构造函数定义private或protected
2.static成员函数不需要对象调用, 里面没有隐含的this
3.如果要求只能创建一个对象,则要将删除拷贝构造还有赋值
静态成员函数用引用返回
还可以把唯一的对象不放在接口里面创建:
方法一:
class A
{
private:A(){};static A* getInstance() {if(a==NULL){a = new A;}return a; }
private:static A*a;
}
A* A::a = NULL;//类外初始化,使用时才初始化调用
方法二:
class A
{
private:A(){};static A* getInstance() {return a; }
private:static A*a;
}
A* A::a = new A;//程序一开始就创建
程序结束自动释放对象,不能提供释放的接口,否则唯一的对象都没有了。