设计模式实例与代码:Builder模式

[设计模式](四):建造者模式(Builder)与原型模式(Prototype)[含Kotlin深克隆实例代码] 建造者模式(Builder)与原型模式(Prototype)都是创建模式。 阅读详情


意图/定义:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
问题:面对复杂对象的创建工作,通常各个部分对象用一定的算法构成,但复杂对象的各个部分经常面临着剧烈的变化,而将它们组合在一起的算法相对稳定 
解决方案:将各个部分的创建独立封装起来
参与者与协作者:抽象的Builder类,为导向者可能要求创建的每一个构件(Part)定义一个操作(接口)。这些操作缺省情况下什么都不做。一个ConcreteBuilder类对它所感兴趣的构建重定义这些操作。每个ConcreteBuilder包含了创建一个特定产品所有部分的代码,但具体的装配过程在Director中定义。
效果:使得复杂对象的“组装过程”与“部件的构造方式”相分离,二者可以独立变化。单纯的Builder模式中,“不同Product类型”的组成部件之间,不能进行组合或替换。
实现:

相关模式[DP]:

Abstract Factory与Builder相似,因为它可以创建复杂对象。主要的区别是Builder模式着重于一步步构造一个复杂对象,而Abstract Factory着重于多个系列的产品对象(简单的或复杂的)。Builder是最后一步返回产品,而Abstract Factory是立即返回产品。Composite通常是用Builder生成的。

从类图上观察到其中间部分类似于模板方法和策略模式的组合,将某些操作延迟到子类中执行,但builder模式与模板方法实际没有任何关系,Builder基类中并没有定义任何算法步骤相关的内容,装配过程是在Director类完成的。



示例代码:下面代码以制造汽车和摩托车的过程为例,二者的制造过程都可以抽象为创建车身、创建引擎、创建轮子、创建门,但汽车和摩托二者每一步的创建细节又不相同。

using System;
using System.Collections.Generic;

namespace Builder
{
    /// <summary>
    /// MainApp startup class for Real-World
    /// Builder Design Pattern.
    /// </summary>
    public class MainApp
    {
        /// <summary>
        /// Entry point into console application.
        /// </summary>
        public static void Main()
        {
            VehicleBuilder builder;

            // Create shop with vehicle builders
            Shop shop = new Shop();

            builder = new CarBuilder();
            shop.Construct(builder);
            builder.Vehicle.Show();

            builder = new MotorCycleBuilder();
            shop.Construct(builder);
            builder.Vehicle.Show();

            // Wait for user
            Console.ReadKey();
        }
    }

    /// <summary>
    /// The 'Director' class
    /// </summary>
    class Shop
    {
        // Builder uses a complex series of steps
        public void Construct(VehicleBuilder vehicleBuilder)
        {
            vehicleBuilder.BuildFrame();
            vehicleBuilder.BuildEngine();
            vehicleBuilder.BuildWheels();
            vehicleBuilder.BuildDoors();
        }
    }

    /// <summary>
    /// The 'Builder' abstract class
    /// </summary>
    abstract class VehicleBuilder
    {
        protected Vehicle vehicle;

        // Gets vehicle instance
        public Vehicle Vehicle
        {
            get { return vehicle; }
        }

        // Abstract build methods
        public abstract void BuildFrame();
        public abstract void BuildEngine();
        public abstract void BuildWheels();
        public abstract void BuildDoors();
    }

    /// <summary>
    /// The 'ConcreteBuilder1' class
    /// </summary>
    class MotorCycleBuilder : VehicleBuilder
    {
        public MotorCycleBuilder()
        {
            vehicle = new Vehicle("MotorCycle");
        }

        public override void BuildFrame()
        {
            vehicle["frame"] = "MotorCycle Frame";
        }

        public override void BuildEngine()
        {
            vehicle["engine"] = "500 cc";
        }

        public override void BuildWheels()
        {
            vehicle["wheels"] = "2";
        }

        public override void BuildDoors()
        {
            vehicle["doors"] = "0";
        }
    }


    /// <summary>
    /// The 'ConcreteBuilder2' class
    /// </summary>
    class CarBuilder : VehicleBuilder
    {
        public CarBuilder()
        {
            vehicle = new Vehicle("Car");
        }

        public override void BuildFrame()
        {
            vehicle["frame"] = "Car Frame";
        }

        public override void BuildEngine()
        {
            vehicle["engine"] = "2500 cc";
        }

        public override void BuildWheels()
        {
            vehicle["wheels"] = "4";
        }

        public override void BuildDoors()
        {
            vehicle["doors"] = "4";
        }
    }
  
    /// <summary>
    /// The 'Product' class
    /// </summary>
    class Vehicle
    {
        private string _vehicleType;
        private Dictionary<string, string> _parts =
          new Dictionary<string, string>();

        // Constructor
        public Vehicle(string vehicleType)
        {
            this._vehicleType = vehicleType;
        }

        // Indexer
        public string this[string key]
        {
            get { return _parts[key]; }
            set { _parts[key] = value; }
        }

        public void Show()
        {
            Console.WriteLine("\n---------------------------");
            Console.WriteLine("Vehicle Type: {0}", _vehicleType);
            Console.WriteLine(" Frame : {0}", _parts["frame"]);
            Console.WriteLine(" Engine : {0}", _parts["engine"]);
            Console.WriteLine(" #Wheels: {0}", _parts["wheels"]);
            Console.WriteLine(" #Doors : {0}", _parts["doors"]);
        }
    }
}



【设计模式】builder 创建者设计模式详解(包含电商应用场景及代码示例) 在常见的设计模式中,“Builder” 通常是指一种设计模式,而不是具体的类或方法。Builder 模式是一种创建型设计模式,其目的是通过提供一个独立的构建器类来构建一个复杂对象。建造者模式(Builder Pattern) 是一种创建型设计模式,它的主要目标是为了将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。// 订单对象// 构造方法私有化,通过建造者来构建对象// 提供获取订单信息的方法// ...// 订单项对象// 构造方法。 阅读详情

相关推荐

设计模式—“对象创建”

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。​ ——《设计模式》GoF所谓使一个类的实例化延迟到其子类,是因为抽象的 (工厂) 类不知道要实例化哪个具体 (产品) 类,所以实例化动作只能由具体的子 (工厂) 类去做, 抽象和具体 (工厂) 类中定义的、产生实例 (产品) 的接口函数,被我们成为工厂方法,因为它负责 “生产” 一个对象。

Z's Palace 762

给Delphi/C++Builder程序员:编写高质量代码的一个小窍门

今天分析了一个C++Bulider (Delphi)程序的汇编代码,发现了提高代码效率的一个小窍门,希望能给C++Builder和Delphi程序员做代码优化的时候提供一点参考。汇编代码是这样的:一开始判断一个文本框的输入字符是否为空,汇编代码里面有:00456DAB  |. 8D55 E4        LEA EDX,DWORD PTR SS:[EBP-1C]00456DAE  |. 8B

只用正版软件,很难做到么? 2069

时序约束实战:从setup/hold到时钟路径约束的深度解析

本文深度解析数字设计中的时序约束实战,重点探讨如何从setup/hold检查的核心原理出发,理解并应用时钟路径约束。文章通过剖析Path Requirement的计算逻辑,结合同频、倍频及异步时钟域等典型场景,提供了从解读时序报告到编写、调试SDC约束的系统方法,帮助工程师有效应对复杂SoC设计中的时序收敛挑战。

weixin_29291185的博客 105

偷学代码之builder模式

窃格瓦拉之builder模式 身为窃格瓦拉意志传承者,砸门的工作就是借鉴! 先工作,后学习的代价就是,别人的代码都是新鲜的。咱能做的只有借鉴借鉴再借鉴。 今天浏览内部代码时发现这么一段: try{ if(....){ ..... }else{ // 通过大数据保存,并监控xx服务 请求xx服务值为null参数为空 BigDataLog.builder().topic("ser...

P-B-S-T的博客 333

LTE信令流程实战:从Attach到Service Request的完整解析(附常见问题排查)

本文深入解析LTE信令流程中的Attach和Service Request关键环节,提供从基础原理到实战排查的完整指南。涵盖鉴权、承载建立等核心步骤,分析常见故障模式及优化方案,并附赠信令跟踪工具使用技巧,助力通信工程师提升网络运维效率。

alpha的博客 319

EDSR图像超分辨程序复现(踩坑及解决记录)

EDSR图像超分辨程序复现(踩坑及解决记录)

Sunny_Coder的博客 3642

设计模式-建造者模式(Builder)

建造者模式(Builder) 定义 : 将一个复杂对象的构建与它的表示分离, 是的同样的构建过程可以创建不同的表示 用户只需指定需要建造的类型就可以得到它们, 建造过程及细节不需要知道 类型 : 创建型设计模式 适用场景 一个对象有非常复杂的内部结构 想把复杂对象的创建和使用分离 优点 封装性好, 创建和使用分离 扩展性好, 建造类之间独立, 一定程度上解耦 缺点 产生多余的Buil...

听雪楼 432

本体(Ontology)概述

认识本体        本体(Ontology)的概念源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体可以在语义层次上描述知识,可以看成描述某个学科领域知识的一个通用概念模型。德国学者Studer在1998年给出了本体的相关定义“本体是共享概念模型的形式化规范说明”。这个定义包含了四层含义:即共享(share)...

baijinswpu的博客 7万+

Builder design pattern in java

Builder设计模式总结起来,Builder设计模式主要用来解决如下两类问题:1、多参数对象的构造 2、对象构建和显示分离为了理解“多参数对象的构造”,请看下面代码:public class Person { private final String lastName; private final String firstName; private final String m

biscuit的专栏 739

Cadence仿真实战:从零构建高精度带隙基准电压源

本文是一份详细的Cadence仿真实战指南,指导读者从零开始构建高精度带隙基准电压源。文章首先解释了带隙基准电压源稳定输出电压的原理,然后逐步演示了在Cadence Virtuoso环境中如何搭建测试电路、测量关键温度系数、计算并搭建核心电路,并通过参数扫描和迭代调优来驯服温度漂移,最终实现低漂移的基准电压输出。

weixin_29207533的博客 242

从零开始讲DDR(8)——AXI 接口MIG 使用(1)

我们简单拆解了MIG AXI接口中测试文件的整体框架,首先在sim_tb_top.sv文件中例化了DDR模型和example_top。在example_top中,又例化了MIG IP和一个流量产生器ddr4_v2_2_8_axi_tg_top。在ddr4_v2_2_8_axi_tg_top中的主要功能是分别例化了boot_mode_gen,prbs_mode_gen,custom_mode_gen和axi_opcode_gen。

apple_53311083的博客 1587

Mybatis源码学习(八)Mybatis设计模式总结

Mybatis源码学习(八)Mybatis设计模式总结前言1. 寻觅官网demo, quick start2. 根据demo画出调用流程图3. Learn With Questions文章链接 前言 作为业界使用最广的ORM层框架,没有之一.想要翻身码农把歌唱,怎么能不去学习他的源码呢!!! Let’s do it! 注: Mybatis版本3.5.5, 数据库为Mysql 所有后续的mybatis源码学习都是基于上述版本 1. 寻觅官网demo, quick start 窃以为熟悉一个框架的最好方式就是官

K_Tang的博客 500

PINNACLE:PINN自适应配点与实验点选择算法

PINNACLE算法通过引入动态权重机制,实现了PINN训练点选择的自适应优化。该算法基于对训练过程中不同区域学习需求变化的深入理解,设计了平滑过渡的权重函数,确保了模型在不同训练阶段能够优先学习最需要的区域。理论分析和实验结果均表明,PINNACLE不仅能够保证收敛性,而且能够显著提高PINN的性能。这一算法为物理信息神经网络的应用提供了重要支持,尤其适用于复杂PDE问题的求解。

VectorShift的博客 1136

精通Java设计模式,详解5种实用模式

简介设计模式是一种可重用的解决方案,用于解决软件设计中常见的问题。不同类型的设计模式针对解决不同的特定问题或问题组合。如下图所示,一些常见的设计模式类型包括处理对象创建的创建型模式;处理对象组合和组织的结构型模式;以及处理对象和类之间通信的行为型模式。本文分享几种与Java中常用的创建型设计模式相关的代码示例。创建型设计模式创建型设计模式提供了各种对象创建机制,从而增加了现有代码的灵活性和重用性。其主要功能是以最佳方式提供非常具体的解决方案。它们可以进一步分为以下类别。1 单例。

资料免费分享,点击名片 191

华为od 面试八股文_Python语言_01_含答案

华为od 面试八股文_Python语言_01_含答案

MISAYAONE的博客 9095

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java常用的设计模式(一)

设计模式是编程解决实际问题或类似问题的最佳实践,Java编程中处处都是对象,对象需要创建,对象间需要相互调用,对象的模板是类,类与类需要相互关联引用,如何通用解决上述问题,经过长时间的编程实践总结出来的统筹方法就是设计模式,可以理解设计模式就是如何写出高效程序解决某类问题。 设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板

cgmx552的博客 199

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

探索Java的设计模式宝典,深入解析5种设计模式

简介设计模式是一种可重用的解决方案,用于解决软件设计中常见的问题。不同类型的设计模式针对解决不同的特定问题或问题组合。如下图所示,一些常见的设计模式类型包括处理对象创建的创建型模式;处理对象组合和组织的结构型模式;以及处理对象和类之间通信的行为型模式。本文分享几种与Java中常用的创建型设计模式相关的代码示例。创建型设计模式创建型设计模式提供了各种对象创建机制,从而增加了现有代码的灵活性和重用性。其主要功能是以最佳方式提供非常具体的解决方案。它们可以进一步分为以下类别。1 单例。

Reische的博客 161

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python面试设计模式问题_聊聊 Python 面试最常被问到的几种设计模式(下)

1. 前言上篇文章 写到了 Python 最常用的 2 种设计模式,单例模式和工厂模式本篇文章我们继续聊聊面试中,Python 面试经常被问到的设计模式,即:构建者模式代理模式观察者模式2. 构建者模式构建者模式,是将一个复杂对象的构造与表现进行分离,利用多个步骤进行创建,同一个构建过程可用于创建多个不同的表现简单来说,就是将一个复杂对象实例化的过程,按照自己的想法,一步步设置参数,定制一个我们需...

weixin_39931362的博客 110

android 设计模式学习

1.单例模式 public class SingletionStarving { private static final SingletionStarving mInstance = new SingletionStarving(); private SingletionStarving() { } public static SingletionStarving getInstance() { return mInstance; } } //Sing

day_moon的博客 2289

Android中的设计模式

总结Android框架中出现的设计模式。

陆业聪 1589

【设计模式】-建造者模式

###书面定义 将一个复杂对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示。 ###个人理解 建造者模式就是把建造的过程给固定了,每个过程的具体部件可以更换,但是步骤不变,就像我们捏饺子,首先擀皮,其次包陷,最后下锅。在这个过程中,擀皮—包陷—下锅,这些步骤是不变的,由指挥者统一指挥,但是擀什么样的皮,包素馅还是肉馅,或者用什么锅来煮饺子,这些部件都是可以更换的。 ###UML图 ...

化身孤岛的鲸 261

设计模式之命令模式(Command)摘录

设计模式之命令模式(Command)摘录!

网络资源是无限的 2736

Java设计模式--建造者模式(4)

建造者模式的定义:将一个复杂的对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 举个简单的例子:比如一辆汽车,它包括车轮,方向盘,轴,发动机等多种零件,但是对于大多数用户来说,并不需要知道这些装配细节也不会单独使用某一个零件,而是使用一辆完整的汽车。 ...

小菜鸡的博客 248

设计模式2 - 创建型模式

创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。 这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。

初八 635

设计模式之职责链模式(Chain of Responsibility)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象。创建型模式有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些详细的类的信息封装起来。第二,它们隐藏了这些类的实例是怎样被创建和放在一起的。整个系统...

weixin_30544657的博客 77

Java Builder模式(设计模式之Builder模式)

1.设计模式之终极结合 昨天项目上线(今年是没有新需求了,那提前祝大家新年快乐),上班继续最近几期博客的编写。承接上一篇博客观察者模式,这一期我们一起来了解一下Builder模式。我们最近几期博客打算主要讲一下单例模式、观察者模式、Build模式,目的是为了方便后期为大家带来RXJava+Retrofit2.0+Okhttp3结合使用的网络请求框架。 思考了一上午,我该怎么写出Builder模...

IBM_Forever 4万+
上一篇: 设计模式实例与代码:Abstract Factory模式
下一篇: 设计模式与实例代码:Composite模式
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值