设计模式

来源:互联网 发布:虚拟图片打印机软件 编辑:程序博客网 时间:2024/06/05 23:59

单例模式:保证一个类只有一个实例 如一个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;

}