单例模式:保证一个类只有一个实例 如一个PC只能连一个鼠标
优点:1.避免对共享资源的多重占用
2.允许可变数目的实例
3.只有一个实例,可以节约系统资源
4.在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例
缺点:
1.不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
2.由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。(无法继承)
3.单例类的职责过重,在一定程度上违背了“单一职责原则”。
4.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
懒汉: 不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化
饿汉:在单例类定义的时候就进行实例化,本来就是线程安全
Class A (饿汉)
{
private:
A(){}; //构造函数设置为私有,防止类外产生对象实例
static A*a;
public:
static A* getinstance() //静态成员函数属于类不属于对象
{
a=new A();
return a;
}
}
懒汉
class A
{
private:
A(){ pthread_mutex_init(&mux) };
static A*a=NULL;
public:
static pthread_mutex_t mux;
static A *getinstance()
{
if(a==NULL)
{
pthread_mutex_lock(&mux)
if(a==NULL)
a=new A();
pthread_mutex_unlock(&mux);
}
return a;
}
适配器模式:把一个类的接口转换成客户所希望的接口。
class T
{
public:
T(){};
virtual~T(){}; //定义为虚函数 在释放派生类对象时,首先调用派生类的析构函数,再调用基类的(如果不定义,基
virtual void request()=0; //类的析构函数得不到调用)
}
class Adapter:public T
{
public:
Adapter(){};
~Adapter(){};
void request()
{
a->kehu();
}
private:
Y a;
}
class Y
{
public:
Y(){};
~Y(){};
void kehu();
}
int main()
{
T *t=new Adapter();
t->request();
return 0;
}