代理模式:为其他对象提供一种代理以控制这个对象的访问.
1.远程代理- .net中的webservice 客户端引用webservice服务时,生成的webreference就是代理模式应用
2.虚拟代理- 浏览器加载页面中的图片资源时,通过代理获得图片基本大小信息.
3.保护代理- 操作系统对内核的权限保护
4.智能指针- 原始变量的引用计数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Subject 2 { 3 public: 4 virtual void Request() = 0; 5 }; 6 7 class RealSubject : public Subject 8 { 9 public: 10 virtual void Request() 11 { 12 //do something 13 } 14 }; 15 16 class Proxy : public Subject 17 { 18 public: 19 virtual void Request() 20 { 21 realsubject_.Request(); 22 } 23 24 private: 25 RealSubject realsubject_; 26 }; 27 28 //client 29 int main() 30 { 31 Proxy xy; 32 xy.Request(); 33 }
工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类.
工厂方法是为了解决简单工厂在增加同类新产品时违反ocp原则而构造的.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Product 2 { 3 4 }; 5 6 class ConcreteProduct : public Product 7 { 8 9 }; 10 11 class Factory 12 { 13 public: 14 virtual Product* Create() = 0; 15 }; 16 17 class ConcreteFactory : public Factory 18 { 19 public: 20 virtual Product* Create() 21 { 22 return new ConcreteProduct; 23 } 24 }; 25 26 //如果要增加新产品 27 class ProductB : public Product 28 { 29 30 }; 31 32 class NewFactory : public Factory 33 { 34 public: 35 virtual Product* Create() 36 { 37 return new ProductB; 38 } 39 }; 40 41 //client 42 int main() 43 { 44 ConcreateFactory fy; 45 Product* pd = fy.Create(); 46 delete pd; 47 48 //增加了新产品, 只需要增加2个类,而不需要修改已有工厂和产品类 49 NewFacotry fn; 50 Product* pn = fn.Create(); 51 delete pn; 52 }
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.
抽象工厂是在工厂方法的基础上构造, 为了解决在系统中增加不同的产品系列(族).
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Product{}; 2 class ProductA : public Product{}; 3 class ProductB : public Product{}; 4 5 class OtherProduct{}; 6 class OtherProductA : public OtherProduct{}; 7 class OtherProductB : public OtherProduct{}; 8 9 class AbstractFactory 10 { 11 public: 12 virtual Product* Create() = 0; 13 virtual OtherProduct* CreateOther() = 0; 14 }; 15 16 class ConcreteFactoryA : public AbstractFactory 17 { 18 public: 19 virtual Product* Create() 20 { 21 return new ProductA; 22 } 23 24 virtual OtherProduct* CreateOther() 25 { 26 return new OhterProductA; 27 } 28 }; 29 30 class ConcreteFactoryB : public AbstractFactory 31 { 32 public: 33 virtual Product* Create() 34 { 35 return new ProductB; 36 } 37 38 virtual OtherProduct* CreateOther() 39 { 40 return new OhterProductB; 41 } 42 }; 43 44 45 //client 46 int main() 47 { 48 ConcreateFactoryA fac; 49 //当要将产品族切换到OtherProduct时 只需要在客户端修改实例化抽象工厂的地方 50 //ConcreateFactoryB fac; 51 52 Product* pd = fac.Create(); 53 delete pd; 54 55 OtherProduct* pod = fac.CreateOther(); 56 delete pod; 57 }
常用于多数据库多表的数据访问场景下. m种数据库对应m个继承抽象工厂类的子类, 数据库中由n个表组成,则此模式下就具有n个抽象产品类,抽象工厂基类具有n个创建产品的方法.