zoukankan      html  css  js  c++  java
  • 第三天:代理模式工厂方法抽象工厂

    代理模式:为其他对象提供一种代理以控制这个对象的访问.

    1.远程代理- .net中的webservice 客户端引用webservice服务时,生成的webreference就是代理模式应用

    2.虚拟代理- 浏览器加载页面中的图片资源时,通过代理获得图片基本大小信息.

    3.保护代理- 操作系统对内核的权限保护

    4.智能指针- 原始变量的引用计数

    View Code
     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原则而构造的.

    View Code
     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 }

     抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.

    抽象工厂是在工厂方法的基础上构造, 为了解决在系统中增加不同的产品系列(族).

    View Code
     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个创建产品的方法.

  • 相关阅读:
    Linux报错:“/bin/bash^M: 坏的解释器
    搭建单向HTTPS
    Wamp Apache 启动失败检测方法
    Excel 日常操作
    apache https 双向认证
    android搭建
    我身为程序员踩过的坑
    windows 2008 安装 apache + mysql + php
    Svn
    工具软件类
  • 原文地址:https://www.cnblogs.com/neking/p/2918615.html
Copyright © 2011-2022 走看看