zoukankan      html  css  js  c++  java
  • 设计模式之九:建造者模式(Builder)

    建造者模式:
    将一个复杂对象的建造过程和它的表示分离开来,这样同样的建造过程能够创建不同的表示。

    Separate the construction of a complex object from its representation so that the same construction process can create different representations.

    通俗一点就是假设流程是一样的,能够将这些流程抽象成一个类的一些接口。详细的创建过程能够在这个抽象类的子类中来实现。

    C++中这个特性主要就是使用纯虚函数来实现。

    UML图:

    这里写图片描写叙述

    主要包含:

    1. Builder:指定了一个创建Product的一系列的接口。

    2. ConcreteBuilder:通过实现Builder中的接口详细实现了创建的步骤
    3. Director:定义了一个Buidler对象的引用来使用Builder的接口
    4. Product:表示须要创建的对象,ConcreteBuilder创建这个对象的每一部分。

    详细的C++代码例如以下:

    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <list>
    #include <string>
    
    using namespace std;
    
    class Product
    {
            public:
                    void addPart(string str)
                    {
                        parts.push_back(str);
                    }
                    list<string>& getParts()
                    {
                        return parts;
                    }
            private:
                    list<string> parts;
    
    };
    
    class Builder
    {
        public:
                Builder()
                {
                    product=new Product();
                }
                virtual void buildPart1()=0;
                virtual void buildPart2()=0;
                void getResult()
                {
                    list<string>::iterator iter=product->getParts().begin();
                    for(;iter!=product->getParts().end();iter++)
                    {
                        std::cout<<*iter<<std::endl;
                    }
                }
                virtual ~Builder()
                {
                    if(!product)
                            delete product;
                }
            protected:
                Product *product;
    };
    
    class ConcreteBuilder1:public Builder
    {
            public:
                void buildPart1()
                {
                    product->addPart("part one");
                }
                void buildPart2()
                {
                    product->addPart("part two");
                }
    
    };
    
    class ConcreteBuilder2:public Builder
    {
            public:
                void buildPart1()
                {
                    product->addPart("part X");
                }
                void buildPart2()
                {
                    product->addPart("part Y");
                }
    
    };
    
    class Director
    {
        public:
                Director()
                {
    
                }
                Director(Builder * b):build(b)
                {
                }
                void construct()
                {
                    build->buildPart1();
                    build->buildPart2();
                    build->getResult();
                }
    
        private:
                Builder *build;
    
    };
    
    
    int main()
    {
        std::cout<<"建造者模式測试"<<std::endl;
        ConcreteBuilder1* cb1=new ConcreteBuilder1();
        Director d1(cb1);
        d1.construct();
    
        ConcreteBuilder2 * cb2=new ConcreteBuilder2();
        Director d2(cb2);
        d2.construct();
        return 0;
    }
    

    运行结果例如以下:

    这里写图片描写叙述

  • 相关阅读:
    node.js的安装
    简单创建数据库和表
    layui后台框架的搭建
    FlagsAttribute属性在enum中的应用 [转]
    递归页面
    AspNet2.0页面生命周期 [转]
    C#基础概念二十五问[转]
    md5加密方法
    ASP.NET中Cookie编程的基础知识 [转]
    说说“数据库的自动安装、升级” [转]
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7047781.html
Copyright © 2011-2022 走看看