zoukankan      html  css  js  c++  java
  • 设计模式系列之生成器模式

    builder模式主要用于创建复杂对象,着重于复杂对象的内部构建。通过将构建过程与表示分离,同一个构建过程可以生产不同的外部表示。builder模式由导向器和生成器构成,导向器负责构建过程,生成器负责生产对象的外部表示。导向器包含有一个生成器,当需要更换对象表示时,只需要换一个生成器即可。

    上篇文章设计芯片设计软件时,abstract factory更加着重于支持创造多个掩模系列上图形的功能。现在我们换一个重点,现在给出一个掩模上所有图形的信息,这个信息可以存储在格式化文件比如xml文件中,为了方便,在不影响理解的前提下我们使用简单的文本文件,一个字符串表示掩模上的一个图形,比如读入“round”,表示掩模上有个圆形。定义类builder作为导向器,有一个构建过程结构,负责读入文件逐个构建图形。类MaskFigure是一个虚基类,含有构建不同图形的接口,派生出的子类是可以生成不同特点图形的生成器,即负责外部表示。builder包含不同的MaskFigure子类就可以在不修改构建过程接口的前提下生成不同特点的图形。类接口如下:

     

    代码实现如下:

    //mask.hpp
    #ifndef MASK_HPP
    #define MASK_HPP
    
    class MaskFigure{
      public:
        virtual ~MaskFigure()=0;
        virtual void CreateRound()=0;
        virtual void CreateRec()=0;
        virtual void CreateTri()=0;
      protected:
        MaskFigure();
    };
    
    class MaskAFigure:public MaskFigure {
      public:
        MaskAFigure();
        ~MaskAFigure();
        void CreateRound();
        void CreateRec();
        void CreateTri();
    };
    
    class MaskBFigure:public MaskFigure {
      public:
        MaskBFigure();
        ~MaskBFigure();
        void CreateRound();
        void CreateRec();
        void CreateTri();
    };
    #endif
    //mask.cpp
    #include <iostream>
    #include "mask.hpp"
    
    using std::cout;
    using std::endl;
    
    MaskFigure::MaskFigure() {
    
    }
    
    MaskFigure::~MaskFigure() {
    
    }
    
    MaskAFigure::MaskAFigure(){
      cout<<"init MaskAFigure "<<endl;
    }
    
    MaskAFigure::~MaskAFigure() {
      cout<<"delete MaskAFigure"<<endl;
    }
    
    void MaskAFigure::CreateRound(){
      cout<<"create MaskA Round"<<endl;
    }
    
    void MaskAFigure::CreateRec(){
      cout<<"create MaskA Rec"<<endl;
    }
    
    void MaskAFigure::CreateTri(){
      cout<<"create MaskA Tri"<<endl;
    }
    
    MaskBFigure::MaskBFigure(){
      cout<<"init MaskBFigure "<<endl;
    }
    
    MaskBFigure::~MaskBFigure() {
      cout<<"delete MaskBFigure"<<endl;
    }
    
    void MaskBFigure::CreateRound(){
      cout<<"create MaskB Round"<<endl;
    }
    
    void MaskBFigure::CreateRec(){
      cout<<"create MaskB Rec"<<endl;
    }
    
    void MaskBFigure::CreateTri(){
      cout<<"create MaskB Tri"<<endl;
    }
    //builder.hpp
    #ifndef BUILDER_HPP
    #define BUILDER_HPP
    
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include "mask.hpp"
    
    using std::vector;
    using std::cout;
    using std::endl;
    using std::ifstream;
    using std::string;
    
    class MaskBuilder {
     public:
       MaskBuilder(string &, MaskFigure*);
       ~MaskBuilder();
       bool openFile(string &);
       void BuildMask();
       void setMaskFigure(MaskFigure*);
     private:
       ifstream inf;
       MaskFigure *mf;
    };
    
    #endif
    //builder.cpp
    #include <string>
    #include "builder.hpp"
    
    MaskBuilder::MaskBuilder(string &filename, MaskFigure *_mf):inf(), mf(_mf) {
      openFile(filename);
    }
    
    MaskBuilder::~MaskBuilder(){
      inf.close();
    }
    
    bool MaskBuilder::openFile(string& filename){
      if(inf.is_open()){
        inf.close();
        inf.clear(std::ios_base::goodbit);
      }
    
      inf.open(filename);
      if(!inf){
        cout<<"open file ""<<filename<<"" failure"<<endl;
        return false;
      }
      return true;
    }
    
    void MaskBuilder::setMaskFigure(MaskFigure* _mf) {
      mf = _mf;
    }
    
    void MaskBuilder::BuildMask(){
      string ftype;
      while(inf>>ftype){
        if(ftype == "round"){
          mf->CreateRound();
        }else if(ftype == "rec"){
          mf->CreateRec();
        }else if(ftype == "tri"){
          mf->CreateTri();
        }else {
          cout<<"undefine figure type: "<<ftype<<endl;
        }
      }
    }
    //main.cpp
    #include <iostream>
    #include "builder.hpp"
    
    using std::cout;
    using std::endl;
    
    int main() {
      string filename("types");
      MaskAFigure maf;
      MaskBuilder mb(filename,&maf);
      mb.BuildMask();
      MaskBFigure mbf;
      mb.setMaskFigure(&mbf);
      string filename2("types2");
      mb.openFile(filename2);
      mb.BuildMask();
    }

    builder模式适用于:

    1. 构建过程允许被构造的对象有不同的表示时

    2. 创建复杂对象过程独立于他们对象的组成方式

    builder模式的优点在于:

    1. 可以动态改变产品的内部表示,不同的生成器具有不同的表示。

    2. 构造代码和表示代码分开,提高了对象的模块性和复用性。

    3. 精细控制构造过程,builder一步步构建整个对象,最后才得到结果,中间过程是可以精细控制的。

    (完)

  • 相关阅读:
    在springmvc中,什么是逻辑视图?什么是物理视图?
    docker2
    docker1
    HTTP Service 中篇
    HTTP Service 上篇
    Centos7 fstab盘符挂载硬盘导致重启系统失败解决办法
    vsphere网络
    LVS的工作原理认识
    数字转换
    对def函数的参数认识
  • 原文地址:https://www.cnblogs.com/coderkian/p/3967278.html
Copyright © 2011-2022 走看看