zoukankan      html  css  js  c++  java
  • C++------单例模式,模版模式,原型模式,策略模式和适配器模式

    1.单例模式

      单例模式是一种常用的软件模式。在它的核心结构中只有一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类只有一个实例。
      Ps:
      1)单例类只能有一个实例。
      2)单例类必须自己创建自己的唯一实例。
      3)单例类必须给所有其他对象提供这一实例。
      4)单例类的构造方法是私有的

      代码如下: 

     1             #include <iostream>
     2             using namespace std;
     3             class Single
     4             {
     5             public:
     6                 static Single* CreateSingle()
     7                 {
     8                 if(ss == NULL)
     9                 {
    10                     ss = new Single();
    11                 }
    12                 return ss;
    13                 }
    14             private:
    15                 static Single* ss;
    16                 Single()
    17                 {
    18                 cout << "Single()" << endl;
    19                 }
    20             };
    21             Single* Single::ss = NULL;
    22             int main()
    23             {
    24                 Single* ss = Single::CreateSingle();
    25             }    

    2.模版模式

      模版模式是一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

      例如:
        我门填写简历,每个人简历不同,但填写顺序一致  

      代码如下:

                #include <iostream>
                using namespace std;
                class Info
                {
                public:
                    void TemplateMethod()
                    {
                    first();
                    second();
                    third();
                    }
                private:
                    virtual void first() = 0;
                    virtual void second() = 0;    
                    virtual void third() = 0;
                };
    
                class Info1:public Info
                {
                public:
                private:
                    void first()
                    {
                    cout << "first" << endl;
                    }
                    void second()
                    {
                    cout << "second" << endl;
                    }
                    void third()
                    {
                    cout << "third" << endl;
                    }
                };
    
                int main()
                {
                    Info1 man;
                    man.TemplateMethod();
                }

    3.原型模式

        是指指定创建对象的类型,并且通过拷贝这些原型创建新的对象。通过拷贝构造函数实现。

      例如:

        修改简历,只需要修改一份,然后通过打印机设备复印多份即可

      代码如下:

     1             #include <iostream>
     2             using namespace std;
     3             class Resume
     4             {
     5             public:
     6                 Resume(){}
     7                 virtual ~Resume(){}
     8                 virtual Resume* Clone() = 0;
     9             };
    10             class ResumeA:public Resume
    11             {
    12             public:
    13                 ResumeA(){}
    14                 ResumeA(ResumeA& rr)
    15                 {
    16                 cout << "Copy ResumeA(ResumeA&)" << endl;
    17                 }
    18                 Resume* Clone()
    19                 {
    20                 return new ResumeA(*this);
    21                 }
    22                 ~ResumeA(){}
    23             };
    24 
    25             int main()
    26             {
    27                 ResumeA aa;
    28                 Resume* a = aa.Clone();
    29             }

    4.策略模式

        策略模式是指定义一系列的算法进行分别封装,它们可以相互替换。本模式可以使算法独立于使用它的客户而变化。对外的接口是一样的,完成的功能是一样的,只是各自实现的上有差异。

      例如:

        Cache的替换算法;cache高速缓冲存储器一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问。

      代码如下:

     1             #include <iostream>
     2             using namespace std;
     3             class ReplaceAlgorithm
     4             {
     5             public:
     6                 virtual void Replace() = 0;
     7             };
     8             class FIFO_ReplaceAlgorithm:public ReplaceAlgorithm
     9             {
    10             public:
    11                 void Replace()
    12                 {
    13                 cout << "FIFO_ReplaceAlgorithm" << endl;
    14                 }
    15             };
    16             class LRU_ReplaceAlgorithm:public ReplaceAlgorithm
    17             {
    18             public:
    19                 void Replace()
    20                 {
    21                     cout << "LRU_ReplaceAlgorithm" << endl;
    22                 }
    23             };
    24 
    25             class Random_ReplaceAlgorithm:public ReplaceAlgorithm
    26             {
    27             public:
    28                 void Replace()
    29                 {
    30                     cout << "Random_ReplaceAlgorithm" << endl;
    31                 }
    32             };

    Cache有三种方法使用第一种通过构造函数参数获取算法类对象

     1             class Cache
     2             {
     3             public:
     4                 Cache(ReplaceAlgorithm* ra)
     5                 {
     6                 mm = ra;
     7                 }
     8                 ~Cache(){delete mm;}
     9                 void Replace(){ mm->Replace();}
    10             private:
    11                 ReplaceAlgorithm* mm;
    12             };
    13 
    14             int main()
    15             {
    16                 Cache mm(new Random_ReplaceAlgorithm());
    17                 mm.Replace();
    18             }

    第二种,通过算法名的标签创建算法类对象

     1             enum RA {LRU,FIFO,RANDOM};
     2             class Cache
     3             {
     4             public:
     5                 Cache(enum RA ss)
     6                 {
     7                     if(ss == LRU)
     8                     mm = new LRU_ReplaceAlgorithm();
     9                 else if(ss == FIFO)
    10                     mm = new FIFO_ReplaceAlgorithm();
    11                 else
    12                     mm = new Random_ReplaceAlgorithm();
    13                 }
    14                 ~Cache(){delete mm;}
    15                 void Replace(){ mm->Replace();}
    16             private:
    17                 ReplaceAlgorithm* mm;
    18             };
    19             int main()
    20             {
    21                 Cache mm(LRU);
    22                 mm.Replace();
    23             }

    第三种类模板实现

     1             template <typename RA>
     2             class Cache
     3             {
     4             public:
     5                 Cache(){}
     6                 ~Cache(){}
     7                 void Replace(){ mm.Replace();}
     8             private:
     9                 RA mm;
    10             };
    11             int main()
    12             {
    13                 Cache<FIFO_ReplaceAlgorithm> mm;
    14                 mm.Replace();
    15             }

    5.适配器模式

        是指将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能在一起工作的哪些类可以一起工作

      例如:

        读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

        有一个类需要实现数据插入和删除,现在有一个数组类里面有插入和删除的方法,通过适配器实现调用数组类的方法。

      代码如下:

      1             #include <iostream>
      2             using namespace std;
      3             class Sequence
      4             {
      5             public:
      6                 Sequence(){};
      7                 virtual void push(int num) = 0;
      8                 virtual void pop() = 0;
      9             };
     10 
     11             /*
     12              * 默认数组大小是10;
     13              * 插入,如果数组已满,重新申请size+10的空间
     14              * 删除,如果数组为空,删除返回-1;
     15              *               不为空,返回当前删除的值;
     16              * 获取指定位置的数值,如果指定位置超出当前的数据长度,返回-1,并显示数据长度
     17              *                                 在当前的数据长度,返回指定位置的数值
     18              * 设置指定位置的数值,如果指定位置超出当前空间的大小,显示空间大小
     19              *                                 
     20              */ 
     21             class Array
     22             {
     23             public:
     24                 Array()
     25                 {
     26                 size = 10;
     27                 len = 0;
     28                     p = new int[size];
     29                 *p = 0;
     30                 }
     31                 Array(int len)
     32                 {
     33                 
     34                 p = new int[len];
     35                 this->len = 0;
     36                 this->size = len;
     37                 }
     38                 Array(int len, int data)
     39                 {
     40                 this->size = len;
     41                 this->len = len-1;
     42                 p = new int[size];
     43                 for(int i=0; i<size; i++)
     44                 {
     45                     *(p+i) = data;
     46                 }
     47                 //cout << "Arrat(int,int)" << endl;
     48                 }
     49                 int get(int index)
     50                 {
     51                 if(index > len)
     52                 {
     53                         cout << "超出范围" << endl;
     54                     cout << "当前最后数据长度:"<<len;
     55                     return -1;
     56                 }
     57                 return p[index];
     58                 }
     59                 void set(int index, int data)
     60                 {
     61                 if(index > size)
     62                 {
     63                     cout << "超出范围" << endl; 
     64                     cout << "当前空间大小为:" << size << endl;
     65                     return;
     66                 }   
     67                 p[index] = data;
     68                 }
     69                 void push_back(int data)
     70                 {
     71                 if(isFull() == true)
     72                 {
     73                    //空间已满,重新申请内存(为避免多次申请内存,每次申请size+10的空间),释放原来内存
     74                    getNewKongjian();
     75                 }
     76                 len += 1;
     77                 p[len] = data;
     78                 cout << "push_back()" << endl;
     79                 }
     80                 void push_front(int data)
     81                 {
     82                 if(isFull() == true)
     83                 {
     84                     getNewKongjian();
     85                 }
     86                 for(int i = len;i >= 0; i--)
     87                 {
     88                     p[i+1] = p[i];
     89                 }
     90                 len += 1;
     91                 p[0] = data;
     92                 cout << "push_fron" << endl;
     93                 }
     94                 int pop_back()
     95                 {
     96                 if(isEmpty() == true)
     97                 {
     98                     cout << "没有数据可以删除,当墙空间为空" << endl;
     99                     cout << "当前空间大小是:" << this->size << endl;
    100                     return -1;
    101                 }
    102                 int temp = p[len];
    103                 len -= 1;
    104 
    105                 cout << "pop_back()" << endl;
    106                 return temp;
    107                 }
    108                 int pop_front()
    109                 {
    110                 if(isEmpty() == true)
    111                     {
    112                         cout << "没有数据可以删除,当前空间为空" << endl;
    113                         cout << "当前空间大小是:" << this->size << endl;
    114                         return -1;
    115                     }
    116                 int temp = p[0];
    117                 for(int i = 0; i <= len; i++)
    118                 {
    119                     p[i] = p[i+1];
    120                 }
    121                 p[len] = 0;
    122                 len -= 1;
    123                 cout << "pop_front()" << endl;
    124                 return temp;
    125                 }
    126                 ~Array()
    127                 {
    128                 delete[] p;
    129                 p = NULL;
    130                 len = 0;
    131                 cout << "~Array" << endl;
    132                 }
    133                 void Show()
    134                 {
    135                     for(int i = 0; i < len; i++)
    136                     cout << p[i] <<" ";
    137                 cout << endl;
    138                 }
    139 
    140             private:
    141                 int * p;
    142                 int len;
    143                 int size;
    144                 bool isFull()
    145                 {
    146                 if(len == size-1)
    147                     return true;
    148                 else
    149                     return false;
    150                 }
    151                 bool isEmpty()
    152                 {
    153                 if(len == -1)
    154                     return true;
    155                 else
    156                     return false;
    157                 }
    158                 void getNewKongjian()
    159                 {
    160                 
    161                 size += 10;
    162                     int* temp = new int[size];
    163                     //将原来数据拷贝到新内存中
    164                     for(int i=0;i<=len;i++)
    165                     { 
    166                         temp[i] = p[i];
    167                     }
    168                     delete[] p;
    169                     p = temp;
    170                 }
    171             };
    172             class Queue:public Sequence
    173             {
    174             public:
    175                 Queue():a(){}    
    176                 Queue(int len):a(len){}
    177                 Queue(int len, int data):a(len,data){}
    178                 ~Queue()
    179                 {
    180                 cout << "~Queue" << endl;
    181                 }
    182                 void push(int num)
    183                 {
    184                 a.push_back(num);
    185                 }
    186                 void pop()
    187                 {
    188                 cout << a.pop_back() << endl;
    189                 }
    190             private:
    191                 Array a;
    192             };
    193 
    194             int main()
    195             {
    196                 {
    197                     Sequence* da = new Queue(2,3);
    198                     da->push(1);
    199                     da->pop();
    200                 da->pop();
    201                 da->pop();
    202                 da->pop();
    203                 delete da;
    204                 }
    205             }
  • 相关阅读:
    bootstrap 学习笔记
    js 学习笔记 -- webpack 简介
    js 学习笔记 -- webapi
    js 学习笔记 -- js基础知识
    css学习笔记二--IFC
    css 学习笔记一
    vim学习笔记
    Linux 网络命令
    Java中循环冗余校验(CRC32)的实现
    Tomcat8启动报there was insufficient free space available after evicting expired cache entries
  • 原文地址:https://www.cnblogs.com/zhangzeze/p/9397979.html
Copyright © 2011-2022 走看看