建造者模式(Builder)

什么是建造者模式?大部分网上的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示是看完之后是不是一头雾水啊,我们可以和工厂模式进行比较一下,前面我们已经了解过了工厂模式,它是创建单个类的模式,而建筑者模式则是让各种产品集中管理,用来创建复合对象。复合对象就是指某个类具有不同的属性;

下面我们用一个例子进行讲解,比如一个User类,我们需要构建一大批用户,用户属性:username,password,mail,age,sex;

package cs_factory;

public class User {

private String username;

private String password;

private String mail;

private int age;

private String sex;

public String getMail() {

return mail;

}

public void setMail(String mail) {

this.mail = mail;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

}

不同用户注册的时候可能全都填写了,而有一些就填了昵称和密码

所有需要构造方法了:

public User(String username, String password, String mail, int age, String sex) {

super();

this.username = username;

this.password = password;

this.mail = mail;

this.age = age;

this.sex = sex;

}

public User(String username, String password){

super();

this.username = username;

this.password = password;

}

其他不一一写了,方法大家都懂

而测试类就该这样,你就可以这样创建各个需要的对象

User user1 = new User("一只猫","123","123@qq.com",16,"女");

User user2 = new User("一条鱼","123",20,"男");

User user3 = new User("一只狗","123","456@qq.com");

User user4 = new User("一个人","123");

我们可以观察一下这样写是不是可读性很差,鬼知道里面的123是什么,16是什么。如果这样不明显,那么你再加两个属性:身高,体重;是不是更看不懂了。

private double height;
     private double weight;

我们再想想看,就是当有很多参数时,编写这个构造函数就会显得异常麻烦,这时候如果换一个角度,试试Builder模式,你会发现代码的可读性一下子就上去了。我们这样干,把User的构造方法都不要,在里面这样写:

...

private User(Builder builder) {

this.username=builder.username;

this.password=builder.password;

this.mail=builder.mail;

this.age=builder.age;

this.sex=builder.sex;

}

static class Builder{

private String username;

private String password;

private String mail;

private int age;

private String sex;

public Builder username(String username){

this.username=username;

return this;

}

public Builder password(String password){

this.password=password;

return this;

}

public Builder mail(String mail){

this.mail=mail;

return this;

}

public Builder age(int age){

this.age=age;

return this;

}

public Builder sex(String sex){

this.sex=sex;

return this;

}

public User build(){

return new User(this);

}

}

...

那么我们就可以这样构造了:

User.Builder builder = new User.Builder();

User user = builder

.username("一只猫")

.password("123")

.mail("123@qq.com")

.age(18)

.sex("女")

.build();

四个字形容:“简单明了” 三个字形容:“真清楚” 两字:“漂亮” 一字:“酷”。

我就问你们是不是都知道我要填的什么属性。在Builder类中的成员函数返回Builder对象自身的另一个作用就是让它支持链式调用,使代码可读性大大增强。其实在java中有两个常见的类也是Builder模式,那就是StringBuilder和StringBuffer。

还有其他的各大框架中广泛应用建造者模式,比如网络请求的okhttp等等。

最后说下我们是怎么干成这样的:

1.首先要一个静态的内部类Builder而且成员和外部类User一毛一样。

2.Builder类通过一系列的方法用于成员变量的赋值,并返回当前对象本身(this)

3.Builder类提供一个build方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有构造函数,该构造函数的参数就是内部类Builder

4.外部类提供一个私有构造函数供内部类调用,在该构造函数中完成成员变量的赋值,取值为Builder对象中对应的值

转载于:https://www.cnblogs.com/llw1996/p/7045174.html

设计模式——建造者模式 1相关推荐

  1. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  2. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

  3. 设计模式 建造者模式_设计模式:建造者

    设计模式 建造者模式 有时需要在应用程序中创建一个复杂的对象. 一种解决方案是Factory模式,另一种是Builder设计模式. 在某些情况下,您甚至可以结合使用这两种模式. 但是在本文中,我想研究 ...

  4. 设计建造者模式java代码,Java设计模式-建造者模式

    定义 Separate the construction of a complex object from its representation so that the sameconstructio ...

  5. python创造者_python 设计模式-建造者模式

    问题:在上一篇python设计模式:抽象工厂模式中,我们尝试用抽象工厂模式规范化了 Pizza 原材料的供应以及 Pizza 的创建.但是我们忽略了一个问题,那就是每种 Pizza 的烘焙时间依赖于生 ...

  6. java设计模式-建造者模式

    概念:使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. ...

  7. 设计模式-建造者模式(转自:http://www.cnblogs.com/cbf4life/archive/2010/01/14/1647710.html)...

    11.1 变化是永恒的 又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:"牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制作了,不过这次又额外增 ...

  8. 大话设计模式—建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类会一步一步构造最 ...

  9. 我的Java设计模式-建造者模式

    在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...

  10. Java常用设计模式————建造者模式

    引言 建造者模式(Builder Pattern)使用多个简单对象一步一步构建成一个复杂的对象.这种类型的设计模式属于建造型模式,它提供了一种创建对象的最佳方式. 一个Builder会一步步构建最终的 ...

最新文章

  1. Android 模仿微信启动动画(转)
  2. 分享一下收到的微软CRM云分享计划 邮件
  3. 无需部署即可测试JPQL / HQL
  4. java中 queryparam_java – 何时使用@QueryParam和@PathParam
  5. Linux同步目录 保留文件修改时间和权限 rsync
  6. oracle sql 基础(六):数据控制语言(用户及权限管理)
  7. 转:华 为 路 由 常 用 命 令
  8. Appium 解决微信公众号、小程序切换 webview 后无法定位元素的问题
  9. Toad for Oracle Authorization key
  10. SQLite:关于日期的字段的优化将给Julia带来大幅效率提升
  11. 地图坐标拾取【获取指定地点经纬度】
  12. CATIA V6二次开发——宏应用
  13. Altium Designer 20查找指定元器件
  14. 阿里短信单发,批量发送
  15. eNSP下园区网综合实验分步配置(1)Eth-Trunk、Vlan、Trunk
  16. python输入名字配对情侣网名_输入名字自动取情侣网名,输入名字自动取网名
  17. ppm调制matlab程序,求助:谁能帮我编写一个4ppm的解调程序 谢谢了
  18. 我为啥叫这个名字,莫名其妙的油葫芦
  19. 中国超级计算行业发展动态及投资战略研究报告(2022-2027年版)
  20. CentOS6怎样开启MySQL远程访问

热门文章

  1. php图片存储内容读取,php读取和保存base64编码的图片内容
  2. 小肽相关1~peptidomic discovery of short open reading frame–encoded peptides in human cells
  3. 蒙特卡洛树搜索_蒙特卡洛树搜索与Model-free DRL
  4. 基于隐马尔可夫模型的有监督词性标注
  5. 图像融合(一)--概述
  6. python如何创建工程预设_如何在sublime3项目设置中设置python模块的搜索路径?ImportError: No module named *的解决办法...
  7. Markdown语法(一)标题段落分割线
  8. “21天好习惯”第一期-15
  9. php下载功能,js php实现无刷新下载功能
  10. dateformat java 并发_SimpleDateFormat并发隐患及其解决