zoukankan      html  css  js  c++  java
  • Builder(生成器)-对象创建型模式

    一.意图

        将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。

    二.动机

        一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加。Bulider模式期望将解析原材料的过程与利用原材料生产产品的过程分离开,以达到用户不需要知道根据原材料构建产品的详细过程,并可以方便的增加新的产品。

    三.适用性

    • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    • 当构造过程必须允许被构造的对象有不同的表示时。

    四.类图

        

    如以上类图所示,Director只负责组建整个流程,并不关心组建的具体过程,组建的细节由每一个Bulider负责。

    五.实例代码

        

    #include "Builder.h"
    #include "Product.h"
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    
    class Director
    {
    public:
        Builder* m_builder;
        Product * m_product;
        Director(Builder*builder) : m_builder(builder)
        {
    
        }
        void ParseElement(int element)
        {
            switch (element)
            {
                case 1:
                    m_builder->BuildHouse();
                    break;
                case 2:
                    m_builder->BuildHouse();
                    break;
                case 3:
                    m_builder->BuildHouse();
            }
        }
    
        Product * GetProduct()
        {
             m_product = m_builder->GetProduct();
             return m_product;
        }
    };
    Director.h
    #include "Builder.h"
    #include "Product.h"
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    
    class Director
    {
    public:
        Builder* m_builder;
        Product * m_product;
        Director(Builder*builder) : m_builder(builder)
        {
    
        }
        void ParseElement(int element)
        {
            switch (element)
            {
                case 1:
                    m_builder->BuildHouse();
                    break;
                case 2:
                    m_builder->BuildHouse();
                    break;
                case 3:
                    m_builder->BuildHouse();
            }
        }
    
        Product * GetProduct()
        {
             m_product = m_builder->GetProduct();
             return m_product;
        }
    };
    Builder.h
    #ifndef PRODUCT_H_
    #define PRODUCT_H_
    
    
    class Product
    {
    public:
        Product()
        {
        }
    };
    
    class ProductA : Product
    {
        public:
        ProductA()
        {
        }
    };
    
    class ProductB : Product
    {
    public:
        ProductB()
        {
        }
    };
    
    class ProductC : Product
    {
    public:
        ProductC()
        {
        }
    };
    
    #endif
    Product.h
    #include "Director.h"
    #include "Builder.h"
    
    void main()
    {
        Builder *builder = (Builder *)new BuilderA();
        auto director = new Director(builder);
        director->ParseElement(1);
        director->ParseElement(2);
        director->ParseElement(3);
        auto product = director->GetProduct();
    
        builder = (Builder *)new BuilderB();
        director = new Director(builder);
        director->ParseElement(1);
        director->ParseElement(2);
        director->ParseElement(3);
        product = director->GetProduct();
    
        builder = (Builder *)new BuilderC();
        director = new Director(builder);
        director->ParseElement(1);
        director->ParseElement(2);
        director->ParseElement(3);
        product = director->GetProduct();
    
        while(1);
        
    
    }
    Test Code

    以上实例代码,以建房子为例,其中材料用整数1,2,3模拟,代表不同的材料。Director为解析材料的工作人员。有BuliderA,BuliderB,BuliderC三位建筑师,解析材料的工作人员把材料交给三位建筑师后,将会建造出三种不同的房子。测试结果如下:

    六.效果

    • 可以改变一个产品的内部表示
    • 将构造代码和表示代码分开
    • 对构造过程进行更精细的控制。
  • 相关阅读:
    Union all 分别排序
    GridView中显示bool字段(在数据库中是字符类型)
    oracle语句有关知识
    验证控件验证DropDownList
    【Java高级工程师蜕变之路】013 Spring MVC基础以及高级应用
    【Java高级工程师蜕变之路】012 Spring AOP源码分析
    【Java高级工程师蜕变之路】010 Spring IOC的应用
    【Java高级工程师蜕变之路】017 Spring Data JPA的应用与源码剖析
    【Java高级工程师蜕变之路】009 手写IOC和AOP
    【Java高级工程师蜕变之路】015 Spring MVC源码剖析
  • 原文地址:https://www.cnblogs.com/mgp200866130/p/5428577.html
Copyright © 2011-2022 走看看