设计模式——9.建造者模式

建造者模式(Builder)

Builder模式简介:

将一个复杂对象的构建其表示相分离,使得同样的构建过程(稳定部分)可以创建不同的表示(变化)

Builder模式结构:

pvNBAAy.png

Builder模式要点:

  • Builder模式主要用于分步骤构建一个复杂对象,其中的构建步骤是稳定的,而负责对象的各个部分则经常变化。

  • 要注意不同语言例如C++、C#中构造函数内调用虚函数机制的差别。

C++代码

具体产品类Product:


    #pragma once
    #include<string>
    #include<iostream>
    using namespace std;
    
    class Product
    {
    public:
        Product();
        virtual ~Product();
        void setPartA(string pA);
        void setPartB(string pB);
        void setPartC(string pC);
        void echo();
    
    private:
        string m_pA;
        string m_pB;
        string m_pC;
    };

    //file: Product.cpp
    #include "pch.h"
    #include "Product.h"
    
    Product::Product() {}
    
    Product::~Product() {}
    
    void Product::setPartA(string pA)
    {
        m_pA = pA;
    }
    
    void Product::setPartB(string pB)
    {
        m_pB = pB;
    }
    
    void Product::setPartC(string pC)
    {
        m_pC = pC;
    }
    
    void Product::echo()
    {
        cout << "The Product's PartA name : " <<m_pA << " , PartB name : " << m_pB << " , PartC name : " << m_pC << " ." << endl;
    }

创建具体产品各个部分的接口类Builder以及其具体实现类:


    //file: Builder.h
    #pragma once
    #include "Product.h"
    class Builder
    {
    public:
        Builder();
        virtual ~Builder();
        virtual void buildPartA() =0;
        virtual void buildPartB() = 0;
        virtual void buildPartC() = 0;
        virtual Product* getProduct();
    
    protected:
        Product* m_prod;
    };
    
    class ConcreteBuilder1 : public Builder
    {
    public:
        ConcreteBuilder1();
        virtual ~ConcreteBuilder1();
        virtual void buildPartA();
        virtual void buildPartB();
        virtual void buildPartC();
    };


    //file: Builder.cpp
    #include "pch.h"
    #include "Builder.h"
    
    Builder::Builder() 
    {
        m_prod = new Product();
    }
    
    Builder::~Builder() {}
    
    Product* Builder::getProduct()
    {
        return m_prod;
    }
    
    ConcreteBuilder1::ConcreteBuilder1() {}
    
    ConcreteBuilder1::~ConcreteBuilder1() {}
    
    void ConcreteBuilder1::buildPartA()
    {
        m_prod->setPartA("PartA 1");
    }
    
    void ConcreteBuilder1::buildPartB()
    {
        m_prod->setPartB("PartB 1");
    }
    
    void ConcreteBuilder1::buildPartC()
    {
        m_prod->setPartC("PartC 1");
    }

Director指挥者类:


    //Director.h
    #pragma once
    #include "Builder.h"
    class Director
    {
    public:
        Director();
        virtual ~Director();
        void setBuilder(Builder* pB);
        Product* construct();
    protected:
        Builder* m_builder;
    };

    //file:Director.cpp
    #include "pch.h"
    #include "Director.h"
    
    Director::Director() {}
    
    Director::~Director() {}
    
    void Director::setBuilder(Builder* pB)
    {
        m_builder = pB;
    }
    
    Product* Director::construct()
    {
        m_builder->buildPartA();
        m_builder->buildPartB();
        m_builder->buildPartC();
        return m_builder->getProduct();
    }

客户端实例代码:


    // BuilderPattern.cpp : This file contains the 'main' function. Program execution begins and ends there.
    #include "pch.h"
    #include <iostream>
    #include "Director.h"
    
    int main()
    {
        Builder* builder1 = new ConcreteBuilder1();
        Director* director = new Director();
        director->setBuilder(builder1);
        Product* p1 = director->construct();
        p1->echo();
    
        delete p1, builder1 ,director;
        return 0;
    }

输出实例:

fz9V6p8.png

C#代码

具体产品类Product:


    public class Product
    {
        public string PartA { get; set; }
        public string PartB { get; set; }
        public string PartC { get; set; }

        public void Echo()
        {
            Console.WriteLine("The Product's PartA name :{0} , PartB name : {1} , PartC name : {2} .",PartA,PartB,PartC);
        }
    }

创建具体产品各个部分的接口类Builder以及其具体实现类:


    public abstract class Builder
    {
        public Builder()
        {
            product = new Product();
        }

        public abstract void BuildPartA();
        public abstract void BuildPartB();
        public abstract void BuildPartC();

        public virtual Product GetProduct()
        {
           return product;
        }

        protected Product product;
    }

    public class ConcreteBuilder1 : Builder
    {
        public override void BuildPartA()
        {
            product.PartA = "PartA 1";
        }

        public override void BuildPartB()
        {
            product.PartB = "PartB 1";
        }

        public override void BuildPartC()
        {
            product.PartC = "PartC 1";
        }
    }

    public class ConcreteBuilder2 : Builder
    {
        public override void BuildPartA()
        {
            product.PartA = "PartA 2";
        }

        public override void BuildPartB()
        {
            product.PartB = "PartB 2";
        }

        public override void BuildPartC()
        {
            product.PartC = "PartC 2";
        }
    }

Director指挥者类:


    public class Director
    {
        Builder builder;

        public Director() { }

        public Director(Builder pBuilder)
        {
            builder = pBuilder;
        }

        public void SetBuilder(Builder pBuilder)
        {
            builder = pBuilder;
        }

        public Product Construct()
        {
            builder.BuildPartA();
            builder.BuildPartB();
            builder.BuildPartC();
            return builder.GetProduct();
        }
    }

客户端实例代码:


    class Program
    {
        static void Main(string[] args)
        {
            Builder builder1 = new ConcreteBuilder1();
            Director director = new Director(builder1);
            Product p1 = director.Construct();
            p1.Echo();

            Builder builder2 = new ConcreteBuilder2();
            director.SetBuilder(builder2);
            Product p2 = director.Construct();
            p2.Echo();

            Console.ReadKey();
        }
    }

实例输出:

yiEfopV.png

REF

书籍:

设计模式与游戏开发、大话设计模式

GitHub:

https://github.com/me115/design_patterns

转载于:https://www.cnblogs.com/sylvan/p/9978981.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值