设计模式 - 学习笔记 - 建造者模式Builder Pattern
发布日期:2021-06-30 14:54:13
浏览次数:2
分类:技术文章
本文共 3461 字,大约阅读时间需要 11 分钟。
设计模式 - 学习笔记 - 建造者模式Builder Pattern
学习总结
- 属于对象创建模式。
- 与工厂的区别在于工厂更关心得到产品,建造者更重视建造过程。
动机 Motivation
- 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一-定的算法构成;由于需求的变化,这个复 杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一-起的算法却相对稳定。
- 如何应对这种变化?如何提供一种“封装机制"来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?
要点总结
- Builder模式主要用于“分步骤构建一个复杂的对象”。在这其中“
分步骤
”是一个稳定
的算法,而复杂对象的各个部分
则经常变化
. - 变化点在哪里,封装哪里——Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。
- 在Builder模式中,要注意不同语言中构造器内调用虚函数的差别(C++ Vs. C#)。
应用场景
UML
代码示例
1. 手工打造
package com.jerry.designpattern.builder.demo1;/** * @author jerryjin * @Classname Hero * @Description name、age 为必填项目 * @Date 2021-04-08 16:19 */public class Hero { private String name; private int age; private String wquipment ; private double money ; public static Hero.Builder builder(String name, int age){ return new Builder(name, age); } private Hero(Builder builder) { this.name = builder.name; this.age = builder.age; this.wquipment = builder.wquipment; this.money = builder.money; } public static class Builder{ private final String name;/*必填*/ private final int age;/*必填*/ private String wquipment ; private double money ; public Builder(String name, int age) { this.name = name; this.age = age; } public Builder wquipment(String wquipment){ this.wquipment = wquipment; return this; } public Builder money(double money){ this.money = money; return this; } // 建造... public Hero build(){ return new Hero(this); } } @Override public String toString() { return "英雄:" + name + ", 年龄:" + age + ", 装备:" + wquipment + ", 银两:" + money +"万"; }}
public class BuilderPatternDemo { public static void main(String[] args) { Hero hero = Hero.builder("华安", 18) .wquipment("无头枪") .money(100) .build(); System.out.println(hero); } }
2. 使用 lombok的 @Builder
2.1. 默认值
@Builderpublic class Hero { @Builder.Default private String name = "张三"; @Builder.Default private Integer age = 18; private String wquipment ; private Double money ; @Singular private Listfriends; @Override public String toString() { return "英雄:" + name + ", 年龄:" + age + ", 装备:" + wquipment + ", 银两:" + money +"万"; }}
2.2. 必填项
@Builder(builderMethodName ="innerBuilder")public class Hero2 { private String name; private Integer age; private String wquipment ; private Double money ; @Singular private Listfriends; public static Hero2Builder builder(String name, Integer age){ return innerBuilder().name(name).age(age); } @Override public String toString() { return "英雄:" + name + ", 年龄:" + age + ", 装备:" + wquipment + ", 银两:" + money +"万"; }}
2.3. Demo
public class BuilderPatternDemo { public static void main(String[] args) { Hero hero = Hero.builder() .name("华安") .age(20) .wquipment("无头枪") .money(100.0) .build(); System.out.println(hero); System.out.println(Hero.builder().wquipment("无头枪").money(100.0).build()); System.out.println(Hero2.builder("李逵", 18).wquipment("板斧").money(100.0).build()); } }
参考资料
转载地址:https://jerryjin.blog.csdn.net/article/details/115912609 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月19日 15时06分58秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
scala list
2019-05-01
k8s设置阿里云仓库
2019-05-01
svn服务器安装
2019-05-01
spark 笔记1
2019-05-01
svn 没有作者信息) | (没有时间信息
2019-05-01
shell dirname basename
2019-05-01
未来已至,5G加持下的云游戏将走向何方?
2019-05-01
闭关三月!猛男逆道而行,四杀斩获阿里 / 腾讯 / 京东 / 百度等大厂 offer
2019-05-01
【linux用户模块】用户/用户组的管理
2019-05-01
计算机网络 —— 网络层 1.
2019-05-01
http协议缓存详解
2019-05-01
Echarts使用及动态加载图表数据 折线图X轴数据动态加载
2019-05-01
接口api开发中安全性问题
2019-05-01
spring boot 知识点整理
2019-05-01
URL重定向,referer,referrer和安全
2019-05-01
Android生命周期
2019-05-01
Android进度条自定义——类似ProgressDialog效果的Dialog
2019-05-01
Android 之 ContentProvider 与 ContentResolver
2019-05-01
【接口自动化】
2019-05-01
SpringBoot搭建一个Web工程
2019-05-01