zoukankan      html  css  js  c++  java
  • 【C++设计模式】工厂模式

    最近打算总结一下设计模式(希望可以坚持写完...)。

    设计模式大体上可以分为三种:

    1)创建型(5种)

    具体包括:工厂方法(包括简单工厂),抽象工厂,单例,建造者,原型

    2)结构型模式(7种)

    具体包括:适配器,桥接,组合,装饰器,代理,外观,享元

    3)行为型模式(11种)

    具体包括:策略模式,模版方法,命令,职责链,状态,观察者,中介者,迭代器,访问者,备忘录,解释器

    创建型模式的技巧主要应用于创建对象的方式上。

    结构性模式的技巧主要在于对不同类之间的组合以实现代码复用。

    行为型模式的技巧在于不同类之间的相互作用及相互影响。

    创建型模式

    1)简单工厂模式

    简单工厂一般只包含一个工厂,以及产品抽象类及其子类。

    优点:实现了对象的创建与使用的分离。

    缺点: 每增加一个产品都要修改原来的代码,且需要不断增加新的逻辑。

    enum fruits{
      APPLE,
      GRAPE
    };
    
    //果汁抽象类
    class Juice{
    public:
            virtual void show() = 0;
    };
    
    //果汁具体类,苹果汁
    class AppleJuice : public Juice{
    public:
          void show(){
          cout<<"AppleJuice"<<endl;
        }
    };
    //果汁具体类,葡萄汁
    class GrapeJuice : public Juice{
    public:
          void show(){
          cout<<"GrapeJuice"<<endl;
        }
    };
    
    //工厂类
    class Factory{
    public:
          Juice* getJuice(int type){
          switch (type){
            case APPLE:
              return new AppleJuice();
            case GRAPE:
              return new GrapeJuice();
            default:
              break;
          }
          return NULL;
        }
    };
    
    
    //主函数的使用
    int main()
    {
      Factory* fac = new Factory(); 
      Juice* applejuice1 = fac->getJuice(APPLE);
      Juice* grapejuice1 = fac->getJuice(GRAPE);
      
      //delete...
    }

    2)工厂方法

    工厂方法在于为每一种产品建立一个工厂。一个工厂只生产一种产品。

    因此需要同时包含产品抽象类和工厂抽象类。

    优点:增加新的产品不需要修改原来的代码。

    //果汁抽象类
    class Juice{
    public:
            virtual void show() = 0;
    };
    
    //果汁具体类,苹果汁
    class AppleJuice : public Juice{
    public:
          void show(){
          cout<<"AppleJuice"<<endl;
        }
    }
    //果汁具体类,葡萄汁
    class GrapeJuice : public Juice{
    public:
          void show(){
          cout<<"GrapeJuice"<<endl;
        }
    };
    
    
    //工厂抽象类
    class Factory{
    public:
      virtual Juice* createJuice() = 0
    }
    
    //苹果汁工厂类
    class AppleJuiceFactory{
    public:
          Juice* createJuice(){
          return new AppleJuice();
        }
    };
    
    class GrapeJuiceFactor{
    public:
          Juice* createJuice(){
          return new GrapeJuice();
        }
    };
    
    int main(){
        
          Factory* fac1 = new AppleJuiceFactory();
          Factory* fac2 = new GrapeJuiceFactory();
      
          Juice* applejuice1 = fac1->createJuice();
          Juice* grapeJuice1 = fac2->createJuice();
          
          //delete...
    
    }

    3)抽象工厂模式

    让一个工厂拥有好几条产品线。

    优点:方便扩展新的产品系列

    缺点:增加新的产品时,需要修改所有工厂

    //果汁抽象类
    class Juice{
    public:
            virtual void show() = 0;
    };
    
    class Jam{
    public:
          virtual void show() = 0;
    }
    //果汁具体类,苹果汁
    class AppleJuice : public Juice{
    public:
          void show(){
          cout<<"AppleJuice"<<endl;
        }
    };
    //果汁具体类,葡萄汁
    class GrapeJuice : public Juice{
    public:
          void show(){
          cout<<"GrapeJuice"<<endl;
        }
    };
    
    //果酱具体类,苹果酱
    class AppleJam: public Jam{
    public:
          void show(){
          cout<<"AppleJam"<<endl;
        }
    };
    
    //果酱具体类,葡萄酱
    class GrapeJam: public Jam{
    public:
          void show(){
          cout<<"GrapeJam"<<endl;
        }
    };
    
    //工厂抽象类
    class Factory{
    public:
          virtual Juice* createJuice() = 0;
           virtual Jam* createJam() = 0;
    };
    
    //工厂具体类,苹果工厂
    class AppleFactory{
    public:
          Juice* createJuice(){
              return new AppleJuice();
        }
          Jam* createJame(){
              return new AppleJam();
        }
    };
    
    //工厂具体类,葡萄工厂
    class GrapeFactory{
    public:
          Juice* createJuice(){
              return new GrapeJuice();
        }
          Jam* createJame(){
              return new GrapeJam();
        }
    };
    
    int main(){
         Factory
    * fac1 = new AppleFactory(); Juice* applejuice1 = fac1->createJuice(); Jam* applejam1 = fac1->createJam(); Factory* fac2 = new GrapeFactory(); Juice* grapeJuice2 = fac2->createJuice(); Jam* grapejam2 = fac2->createJam()'' }
  • 相关阅读:
    多态性与转型
    安装tensorflow
    MySQL基础补缺
    各种排序算法理解
    Ubuntu命令行变成白色
    开机显示grub命令
    E: 无法获得锁 /var/lib/dpkg/lock-frontend
    类与方法
    Java语言浅谈
    二进制数的有效讨论
  • 原文地址:https://www.cnblogs.com/corineru/p/11997851.html
Copyright © 2011-2022 走看看