由于只学了几个简单的设计模式,就想分享一下感受。主要是:单例、抽象工厂、代理模式等几个简单的模式。
(一)单例模式:
属于创建对象模式的一种,及最整个程序,智能将类进行一次实例化。用到了静态函数与静态变量的特性,较为简单易懂。
代码:
class My{private: | |
int i; | |
int j; | |
static My * m; | |
My(int i,int j){//构造函数私有化,使客户端无法调用构造函数 | |
this->i=i; | |
this->j=j; | |
} | |
public: | |
static My * Creat(int i,int j ){ | |
if(m==NULL){//表示该类还没有实例化对象 | |
m=new My(i,j); | |
} | |
return m; | |
} | |
void Print(){ | |
cout<<"i="<<i<<endl; | |
cout<<"j="<<j<<endl; | |
} | |
}; | |
My* My::m=NULL; |
(2)抽象工厂
· 也是创建对象方式的一种,主要是为了维持代码的开闭原则,减少类与类之间的耦合度。一个工厂只负责一个方法。这样在扩充方法的同时,只要扩充工厂就可以,不必打开代码进行代码的修改。
代码:
//一个工厂负责一个铲平,便于产品的的增加,减少客户端的麻烦 | |
#include<iostream> | |
using namespace std; | |
class Product{ | |
public: | |
virtual void Do(){ | |
cout<<"Product.Do"<<endl; | |
} | |
virtual ~Product(){ | |
cout<<"Product.des"<<endl; | |
} | |
}; | |
class ProductA:public Product{ | |
public: | |
void Do(){ | |
cout<<"ProductA.Do"<<endl; | |
} | |
~ProductA(){ | |
cout<<"ProductA.des"<<endl; | |
} | |
}; | |
class ProductB:public Product{ | |
public: | |
void Do(){ | |
cout<<"ProductB.Do"<<endl; | |
} | |
~ProductB(){ | |
cout<<"ProductB.des"<<endl; | |
} | |
}; | |
class ProductC:public Product{ | |
public: | |
void Do(){ | |
cout<<"ProductC.Do"<<endl; | |
} | |
~ProductC(){ | |
cout<<"ProductC.des"<<endl; | |
} | |
}; | |
class Factory{ | |
protected: | |
Product *p; | |
public: | |
virtual void send()=0; | |
virtual~Factory(){ | |
delete p; | |
p=NULL; | |
cout<<"Factory.des"<<endl; | |
} | |
}; | |
class FactoryA:public Factory{ | |
public: | |
FactoryA(){ | |
p=new ProductA(); | |
cout<<"Factory.cout"<<endl; | |
} | |
void send(){ | |
p->Do(); | |
} | |
~FactoryA(){ | |
delete p; | |
p=NULL; | |
cout<<"FactoryA.des"<<endl; | |
} | |
}; |
(三)代理模式:
通过代理可以通过代理进行一个又个方法的调用。由于与各个方法之间有共同的父类,可以通过父类来访问各种方法。将多态特性发挥到淋漓尽致,主要用于结构化设计中:
代码: | |
#include<iostream> | |
using namespace std; | |
class Base{ | |
public: | |
virtual void method()=0; | |
virtual ~Base(){ | |
cout<<"Base.des"<<endl; | |
} | |
}; | |
class Source:public Base{ | |
public: | |
void method(){ | |
cout<<"咖啡功能实现"<<endl; | |
} | |
}; | |
//此处还有都种方法模式功能等待代理去用,基本模式框架一致,故在此省略; | |
class Proxy:public Base{//代理 | |
private: | |
Base *t; | |
public: | |
Proxy(Base *t){ | |
this->t=t; | |
} | |
void method(){ | |
t->method(); | |
cout<<"代理功能实现"<<endl; | |
} | |
~Proxy(){ | |
delete t; | |
t=NULL; | |
cout<<"Proxy.des"<<endl; | |
} | |
}; |