1.单例模式概念
定义 :单例模式是一种常见的设计模式,它可以保证系统中一个类只有一个实例,而且该实例易于外界访问(一个类一个对象,共享这个对象)。
条件:
- 只有1个对象
- 易于外界访问
- 共享这个对象
使用情况 :如果希望某个类只有一个对象,就可以使用单例模式。
**案例:**windows的任务管理器,可以重复打开,但是只会出现一个
2.代码分步骤编写
cpp
class Person{
};
void test(){
Person p1;
Person p2;
Person p3 = new Person;
}
正常代码框架如上所示,这样这个类就不止一个对象的,所以第一步:
- 将默认构造函数私有化:防止创建多个对象
cpp
class Person{
private:
Person(){};
};
void test(){
//Person p1; //默认构造函数私有化,都不能创建了
//Person p2;
//Person* p3 = new Person;
}
但是这样一个对象都没有了
- 只要拿到一个对象的指针即可,这个指针指向唯一的对象
cpp
class Person{
private:
Person(){};
public: //这个指针容易外界访问
static Person* person; //唯一(静态)的对象指针
};
Person* Person::person = new Person; //静态变量实现(类内不管权限都能调用构造函数)
void test(){
Person* c1 = Person::person; //c1 == c2,它们指向相同
Person* c2 = Person::person;
}
但是会出现一个问题:
cpp
c1 = NULL; //或者
Person::person = NULL;
那么这个类就访问不到了,因为权限太高,可以使用get、set方法。
- 将唯一的指针私有化,提供只读方法(不提供set方法)
cpp
class Person{
public:
static Person* getInstance(){ //静态成员函数get方法(只能类去访问)
return person;
}
private:
Person(){};
private: //改为私有
static Person* person; //唯一(静态)的对象指针
};
Person* Person::person = new Person; //静态变量实现
void test(){
Person* p1 = Person::getInstance();
Person* p2 = Person::getInstance();
}
但会出现以下问题:
cpp
Person* p3 = new Person(*p1); //拷贝构造,p3 != P1产生了新的对象
- 将拷贝构造函数私有化
cpp
class Person{
public:
static Person* getInstance(){ //静态成员函数get方法(只能类去访问)
return person;
}
private:
Person(){}; //默认构造函数私有化
Person(const Person&){} //拷贝构造函数私有化
private: //改为私有
static Person* person; //唯一(静态)的对象指针
};
Person* Person::person = new Person; //静态变量实现
void test(){
Person* p1 = Person::getInstance(); //p1 == p2
Person* p2 = Person::getInstance();
}
总结
单例模式是一种常见的设计模式,我们需要掌握它,熟练了可以直接看最后一步的代码。一个补充,单例对象在main函数调用之前生成了(静态变量在编译阶段就分配了内存)