builder设计模式

【设计模式】Builder设计模式详解 Builder模式是一种创建型设计模式,用于将一个复杂对象的构建过程与它的表示分离。通过Builder模式,客户端可以一步一步地创建对象,且无需关心内部的创建细节。这种模式特别适用于创建需要很多步骤或者多个构造函数参数的对象。Builder模式的核心思想是将构建复杂对象的过程封装到一个对象中,而不是将这些逻辑暴露给客户端。通过使用Builder模式,客户端可以逐步构建对象,并且在不影响构建过程的情况下,改变对象的内部表示。 阅读详情

考慮今天您要建立一個車庫,您已經構想好一個基本的車庫藍圖,這個車庫的功能很簡單,有一個屋頂、四面牆,其中一面牆設有一個車子進出的門,因為預算的關係,這個車庫要用哪些材質來建立您還沒有決定,您找了兩個建車庫的人,其中一個可以幫您建立一個實用的車庫,但索價較高,另一個的索價較低,但所用的材質都是木頭而已。

無論如何您最終的選擇是什麼,建車庫的人只要按照您的藍圖來建車庫,功能上都是可以達到您的要求的,您這時所扮演的是指導者(Director)的角色,而建車庫的人是建築者(Builder),假設以上所述是一個模擬遊戲中的情節,我們可以使用建築者模式來構造我們的程式結構,如下圖所示:

在這邊我們所觀注的是建立屋頂、牆、門這些元件(component)的操作方法,對身為設計者的您而言,這三個方法必須合乎您的設計藍圖,我們簡單的將這個結構實現如下:

public class Designer {
        private String[] blueprint = {"牆", "屋頂", "門"};
    public void buildGarage(GarageBuilder builder) {
        for(int i = 0; i < blueprint.length; i++) {
            if (blueprint[i].equals("牆"))
                builder.makeWall();
            else if (blueprint[i].equals("屋頂"))
                builder.makeRoof();
            else if (blueprint[i].equals("門"))
                builder.makeDoor();
        }
    }
}
public abstract class GarageBuilder {
    private  Designer builder;
    public abstract void makeWall();
    public abstract void makeDoor();
    public abstract void makeRoof();
    public abstract void printGarage();
}
public class CheapBuilder extends GarageBuilder {
    private String _cheapGarage = "便宜車庫 = ";
    public void makeWall() {
        _cheapGarage = _cheapGarage + "四個木牆 ";
    }
    public void makeRoof() {
        _cheapGarage = _cheapGarage + "一個木屋頂 ";
    }
    public void makeDoor() {
        _cheapGarage = _cheapGarage + "一個木門 ";
    }
        // 這只是顯示成品而已
     public void printGarage() {
        System.out.println("成品: " + _cheapGarage);
    }
}
public class PracticalBuilder extends GarageBuilder {
    private String _practicalGarage = "實用車庫 = ";
    public void makeWall() {
        _practicalGarage = _practicalGarage + "四個水泥牆 ";
    }
    public void makeRoof() {
        _practicalGarage = _practicalGarage + "一個鐵屋頂 ";
    }
    public void makeDoor() {
        _practicalGarage = _practicalGarage + "一個電動門 ";
    }
        // 這只是顯示成品而已
     public void printGarage() {
        System.out.println("成品: " + _practicalGarage);
    }
}
public class Main {
    public static void main(String[] args) {
        Designer you = new Designer();
        GarageBuilder builder = new CheapBuilder();

        you.buildGarage(builder);
        // 這只是顯示成品而已
         builder.printGarage();
    }
}

在我們的結構圖中,有生成實質的車庫產品,而在上面的簡單實現中,只是用字串簡單的實現而已,當然,如果您的產品提供操作,您也可以設計一個抽象介面,並透過抽象介面來操作實現的子類別,您可以使用之前談過的相關模式,或是其它模式來定義與實作您的產品,這就看您的程式要用這個產品作些什麼了。

我們將建築者模式的結構畫出如下:

在Gof(Gang of four)中有給出了一個不錯的例子,以設計文件剖析器為例,該剖析器可以將文件轉換為其它的格式,以DOC文件剖析器為例好了,假設我們希望析剖器可以將DOC文件轉換為RTF或是PDF文件,我們可以如下設計結構:

簡單來說,建築者模式適用的場合,在於使得相同的建築過程可以建立不同的實例,這是其之所以命為Builder的原因。

Site powered by a free Open Source Project / Non-profit License ( more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
 
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.4 Build:#410 Feb 15, 2006) - Bug/feature request - Contact Administrators
微信小程序启用蓝牙设备特征值变化时的notify功能 注意:这里的serviceUUID、notifyCharacteristicUUID 我会在后面写入数据时做重点说明。isNotifyBLECharacteristic:false, //是否启用蓝牙设备服务特征 notify。二、启用蓝牙设备特征值变化时的notify功能。下一篇 将继续介绍 微信小程序蓝牙设备写入数据。 阅读详情

相关推荐

RK3568/RK3588之修改8250驱动实现RS485收发的自动切换

在串口发送前,若为485,则将控制引脚拉为发送状态,在发送后,循环查看是否发送完成,若发送完成则将引脚置回读状态,如此一来,就能实现在内核测控制方向切换,而不会因为延时造成数据丢失,经过测试此办法可行。全部修改完成后,重新编译生成内核文件和设备树文件,烧写到板子上即可。

哒宰的博客 3111

设计模式之Builder模式

将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示原谅我这个定义读了好几遍也没有完全读明白什么意思。

Cinderella_wlw的博客 431

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

mysql 报错ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded

xiaohua616的博客 4万+

Java 设计模式 --- Builder模式 Java Builder 模式

Java 设计模式 --- Builder模式 Java Builder 模式 一、Builder模式 1、builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。 2、有一个User类如下: public class User { private String id ; private String name ; private Integer age ; // ig...

HaHa_Sir的博客 2万+

C#实践项目1

需求: 在CAD内实现两个坐标系的转换。 转换方式为文件内的所有图形从一个坐标系下的坐标,转换到另一个坐标系下的坐标。 进行坐标转换后,仅仅是坐标发生改变,图层、样式等等不会发生变化。

weixin_51182789的博客 5323

空频、空时、空域、时域、频域抗干扰介绍

1、时域抗干扰:对时间域序列进行滤波,滤波系数h(n),采样序列不断进行输入与滤波系数卷积计算,得到响应输出;例如常用的FIR和IIR滤波器。 对于多窄带干扰噪声源和连续波干扰源有较好的处理效果,还可以解决多径问题; 可以通过在接收机前端处理中增加一个嵌入式块实现; 2、频域抗干扰:接收机不容易受到相对于接收机频带以外的强功率干扰; 通常为带通滤波和阻带滤波, 适用于窄带干扰噪声源,连续波干扰源以及较强的频带外干扰噪声源, 3、空域抗干扰:通过多个自适应天线按照特定组合成天线阵列,波束成形,针对

qq_43517907的博客 7300

Java 设计模式 - Builder

Java Design Partterns - Builder

qq_37813031的博客 787

【微服务】SpringBoot 4.0 新特性整合项目实战应用详解

SpringBoot 4.0 新特性整合项目实战应用详解

congge 4586

设计模式之Builder

Builder设计模式解决了传统构造方法在创建复杂对象时的三大痛点:1)避免构造器重载臃肿问题,通过链式调用按需设置属性;2)消除参数顺序记忆负担,每个属性通过独立方法设置;3)内置参数校验机制,确保对象创建时就符合业务规则。该模式将对象构建过程与表示分离,通过Builder类逐步构建,最终调用build()方法生成不可变对象。相比@Builder注解,手动实现Builder可以集成业务校验逻辑(如邮箱格式、手机号验证等),既保证了代码简洁性,又确保了对象创建时的安全性,特别适用于包含大量可选参数的复杂对象

2403_88816570的博客 1024

Midscene.js(1):Chrome 插件实战之基于 AI 驱动 WEB UI 自动化测试「喂饭教程」

Midscene.js 是一款开源的AI驱动UI自动化工具,支持自然语言交互、数据提取、断言验证等多种功能。自然语言交互。本文将以 Midscene.js Chrome 插件为例,带你从零上手,体验如何用最简单的方式实现高效、智能的UI自动化测试。

blues_C的博客 4404

想使用dify实现docx文档的自动生成?试了一圈,感觉还是根据python-docx更靠谱

在软件开发过程中,需求文档、设计文档等材料的编写是每个开发者都绕不开的工作。最近笔者接到一个需要批量生成标准化需求文档的任务,尝试了目前热门的低代码工具Dify后,发现对于稍微复杂格式的文档生成需求(例如文本居中这么简单的需求),最终还是回归到基于python-docx库的解决方案。本文将分享两种技术路线的对比实践。

xiezhipu的博客 2547

Builder设计模式

     在日常的开发过程中,builder设计模式我们会经常见到,同时它也是设计模式比较重要的设计模式之一,那么今天我们就一起来看看,体会一下builder的设计模式的魅力吧   定义: 将一个复杂对象的构建与它的表示进行分离,使得同样的构建过程可以创建不同的表示   场景: (1)相同的方法,不同的执行顺序,产生不同的事件结果 (2)多个部件或零件,都可以装配到一个对象中,但是产...

qq_27970997的博客 379

C#串口通信从入门到精通(5)——打开、关闭串口

本文详细介绍如何打开串口

qq_34059233的博客 6780

23种设计模式之Builder设计模式

23种设计模式之Builder设计模式 概述 建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。 本质 分离了对象子组件的单独构造(由Builder来单独负责)和装配(由Director来负责)...

Startapi的博客 277

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Builder 设计模式

Builder 模式通过将对象的创建过程步骤化,解决了创建复杂对象时的各种问题,提高了代码的可读性和可维护性。在实际开发中,当遇到对象创建过程复杂或者需要多种表示方式的情况时,使用 Builder 模式是一个不错的选择。

weixin_51429644的博客 943

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java builder设计模式_java的设计模式 - Builder模式

Builder 模式的目的?构造对象的方式过于复杂,不如将之抽离出来。比如,构造器参数过多这样说也有点抽象,举个例子吧。举个例子因为它的属性比较多,所以构造函数也是挺吓人的。我看到也不太想调用。如果现在要构造一条消息投递模式(delivery mode)为 2优先级(priority)是 2content-type 为 text/plain在没有 builder 模式之前,是这样构造的new AM...

weixin_39696197的博客 206

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java设计模式之builder模式

Java设计模式之builder模式 今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成的。再次整理一下什么是builder模式以及应用场景。 1. builder简介 builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。 2. 代码实例 我们通常构造一个有很多参...

WangJun的专栏 208

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

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

IBM_Forever 4万+

Builder的设计模式详解

在学习静态内部类的时候时候发现了这种设计模式,网上看了一些资料按照自己的理解写了出来。

weixin_42330641的博客 1363

精讲设计模式-Builder模式

精讲设计模式- Builder模式

咸鱼弟的博客 1298

builder 设计模式

代码: public class Contact { private String name; private String sex; private Integer age; private Contact(Builder builder){ this.name=builder.name; this.sex=builde...

厚积薄发的博客 386

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

Android Dialog中的Builder设计模式

1.Builder设计模式的定义 Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用户不知道内部的具体构建细节。Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到。 2.使用Builde

carlwang100的专栏 1995
上一篇: 如何在jbuilder设计器里进行界面设计?
下一篇: 巧用JPopupMenu(一)
dotnetguy
博客等级 码龄21年 0粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值