当前位置: 首页 > news >正文

设计模式-创建型模式-建造者模式

1.建造者模式定义

      建造者模式又称生成器模式,将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示;

1.1 建造者模式优缺点

优点

  • 封装性好,主要的业务员逻辑封装在指挥者类中;
  • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同创建过程可以创建不同产品对象;
  • 更精细的控制产品的创建过程,使得创建过程更加清晰;
  • 易于扩展,当有新需求时,只需要创建新的建造者类就可以完成,符合开闭原则;

缺点

  • 建造者模式所创建产品一般具有较多共同点,当产品间差异很大,不适用于建造者模式;

1.2 建造者模式应用场景

  • 创建的对象较为复杂,由多个部件构成,各部件面临着复杂的变化,但构件间建造顺序稳定; 
  • 创建复杂对象的算法独立于该对象的组成部分以及他们的装配方式,即产品的构建过程与最终的表示是独立的;

2.建造者模式原理

  • 抽象建造者类(Builder):接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的部件对象的创建;
  • 具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法,在构造过程完成后,提供一个方法返回创建好的负责产品对象;
  • 产品类(Product):要创建的复杂对象(包含多个组成部件);
  • 指挥者类(Director):调用具体建造者创建负载对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各个部分完整创建或按照某种顺序创建(客户端一般只需要与指挥者进行交互);

3.建造者模式实现方式

        【实例】

        生产自行车是一个复杂的过程,它包含了车架,车座等组件的生产。而车架又有碳纤维,铝合金等材质的,车座有橡胶,真皮等材质。对于自行车的生产就可以使用建造者模式。

        这里Bike是产品,包含车架,车座等组件;Builder是抽象建造者,MobikeBuilder和HelloBuilder是具体的建造者;Director是指挥者。类图如下:

        【代码】

        产品

public class Bike {//车架private String frame;//座椅private String seat;public String getFrame() {return frame;}public void setFrame(String frame) {this.frame = frame;}public String getSeat() {return seat;}public void setSeat(String seat) {this.seat = seat;}
}

        构建者类

public abstract class Builder {protected Bike mBike = new Bike();public abstract void buildFrame();public abstract void buildSeat();public abstract Bike createBike();
}public class HelloBuilder extends Builder {@Overridepublic void buildFrame() {mBike.setFrame("碳纤维车架");}@Overridepublic void buildSeat() {mBike.setSeat("橡胶车座");}@Overridepublic Bike createBike() {return mBike;}
}public class MobikeBuilder extends Builder {@Overridepublic void buildFrame() {mBike.setFrame("铝合金车架");}@Overridepublic void buildSeat() {mBike.setSeat("真皮车座");}@Overridepublic Bike createBike() {return mBike;}
}

        指挥者类

public class Director {private Builder mBuilder;public Director(Builder builder) {this.mBuilder = builder;}public Bike construct() {mBuilder.buildFrame();mBuilder.buildSeat();return mBuilder.createBike();}
}

        客户端

public class Client {public static void main(String[] args) {showBike(new HelloBuilder());showBike(new MobikeBuilder());}private static void showBike(Builder builder) {Director director = new Director(builder);Bike bike = director.construct();System.out.println(bike.getFrame());System.out.println(bike.getSeat());}
}

4.建造者模式创建复杂对象

        常用的创建对象方法:

  • 构造方法:参数多的时候可读性与易用性不高,容易搞错参数的顺序,导致隐蔽的bug;
  • set 方法:破环了不可变对象的密闭性;

4.1 建造者模式创建复杂对象实现

  • 目标类的构造方法要传入Builder对象;
  • Builder建造者类位于目标类内部,并使用static修饰;
  • Builder建造者对象提供内置的各种set方法,set方法返回的是builder对象本身;
  • Builder建造者类提供 build() 方法实现目标对象的创建;
public class 目标类{//目标类的构造方法需要传入Builder对象public 目标类(Builder builder){}public 返回值 业务方法(参数列表){}//Builder建造者类位于目标类内部,并且使用static修饰public static class Builder(){//Builder建造者对象提供内置的各种set方法,注意set方法返回的是builder对象本身private String xxx;public Builder setXxx(String xxx){this.xxx = xxx;return this;}//Builder建造者类提供build()方法实现目标对象的创建public 目标类 build(){//校验return new 目标类(this);}}
}

5.lombok使用建造者模式创建对象

         首先对象上添加Builder注解

@Builder
@Data
public class User {private String name;private int age;private String email;
}

        然后创建对象的时候就可以使用建造者创建

public static void main(String[] args) {User user = User.builder().setName("Alice").setAge(30).setEmail("alice@example.com").setBuild();

        设计模式感觉真的是不实践的话好难弄懂,很多操作都不知道有什么必要

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 用 Postgres 就好
  • 对于mp4 android可以正常播放 ios和mac safari不能播放问题处理
  • 研究人员利用ChatGPT的强大功能,创建数字病理学AI工具
  • 前端入门:HTML5全攻略
  • Tomcat 优化
  • LWIP相关知识
  • Java常见算法
  • 光储充能源站微电网及其控制综述入门研究笔记
  • 【Qt】输入类控件QDateTimeEdit
  • IO进程(8)
  • pymysql 与 MySQL数据库交互
  • 开发团队如何应对突发的技术故障和危机?从网易云音乐故障谈起
  • 小程序路由传参和获取页面栈方法
  • 45.5【C语言】typedef
  • 设计模式(三)
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • ES6--对象的扩展
  • mongo索引构建
  • Python实现BT种子转化为磁力链接【实战】
  • tensorflow学习笔记3——MNIST应用篇
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 大型网站性能监测、分析与优化常见问题QA
  • 规范化安全开发 KOA 手脚架
  • 简单易用的leetcode开发测试工具(npm)
  • 使用common-codec进行md5加密
  • 小程序 setData 学问多
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​secrets --- 生成管理密码的安全随机数​
  • ​人工智能书单(数学基础篇)
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #includecmath
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (Java数据结构)ArrayList
  • (Matlab)使用竞争神经网络实现数据聚类
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (九十四)函数和二维数组
  • (面试必看!)锁策略
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)N皇后问题
  • (转)C#调用WebService 基础
  • (转)德国人的记事本
  • (转载)OpenStack Hacker养成指南
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Remoting常用部署结构
  • .NET开源快速、强大、免费的电子表格组件
  • .NET值类型变量“活”在哪?
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • ??myeclipse+tomcat
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • @font-face 用字体画图标
  • @Mapper作用