(一)Builder(建造者)模式
我们一般在构建javabean的对象的时候通常有三种写法:
1.直接通过构造函数传参的方式设置属性,这种方法如果属性过多的话会让构造函数十分臃肿,而且不能灵活的选择只设置某些参数。
2.采用重叠构造区模式,先写第一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个构造器有两个可选参数,以此类推;如果参数比较多时,类里面会出现一堆构造方法,并且阅读困难,很容易就把两个属性参数写颠倒位置了,编译不会出错,但运行就会出错了
3.采用Javabean 的写法,写一堆属性的setter方法,通过生成对象,让后调用setter方法给属性赋值。 这种方法有个劣势就是构造的过程被分到几个调用中,在构造中可能处于不一致状态,无法保证一致性。
今天我们可以尝试采用Builder模式的写法:
public class Person {
private String name;
private String address;
private int age;
private int sex;
public Person(Builder builder) {
this.name = builder.name;
this.address = builder.address;
this.age = builder.age;
this.sex = builder.sex;
}
public static class Builder{
private String name;
private String address;
private int age;
private int sex;
public Builder(String name) {
this.name = name;
}
public Builder address(String address){
this.address = address;
return this;
}
public Builder age(int age){
this.age = age;
return this;
}
public Builder sex(int sex){
this.sex = sex;
return this;
}
public Person build(){
return new Person(this);
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
}
使用如下:
Person person = new Person.Builder("张三").address("上海").build();
Builder 方法是Person中的一个静态内部类,属性和Person中的属性也都一致,所以属性值在Builder中设置,然后通过builder方法构建Person对象。
采用javaBean 写法的缺点就是, 一但调用 new Person() 构造函数后,对象就被创建了,以后在调用 set 方法设置属性的时候这里设置一下,其他地方又设置一下,无法保证对象的状态一致性,而且代码的可读性很差
1. Builder 方式创建的对象,在调用 build() 方法之前是不会创建Request 对象的,所有的属性设置都必须在 build() 方法之前,而且创建了 Request 对象后就不可以更改其属性了,这就保证了对象状态的唯一性,而且代码的可读性也提高了。
2.Builder可以实现类似setter的自由选择参数
(一)Builder(建造者)模式的更多相关文章
- Android设计模式——Builder(建造者)模式
1.建造者模式是一步一步创建一个复杂对象的创建模式.该模式是为了将构建复杂对象的过程和他的部件解耦,使得构建过程和部件表示隔离开. 2.Bulider模式的定义是:将一个复杂对象的构建与它的表示分离, ...
- 一天一个设计模式——Builder建造者模式
一.模式说明 在现实世界中,当我们要构造一个大型工程时(建一个大楼),通常的做法是先建造工程的每个独立部分,然后再逐步构造完成(先打地基,再搭框架,最后逐层累造).在程序设计领域,构造一个复杂的类时( ...
- C++设计模式-Builder建造者模式
作用:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式和AbstractFactory模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:B ...
- Builder 建造者模式
简介 建造者模式的概念:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示. 大概的意思,就是一套的构建过程可以有不同的产品(表示)出来.这些产品(表示)都按照这一套的构建过程被 ...
- Java设计模式(四)Builder建造者模式
一.场景描述 建造者模式同工厂模式.抽象工厂模式一样,用于创建继承类对象. 工厂模式:http://www.cnblogs.com/mahongbiao/p/8618970.html 抽象工厂模式:h ...
- 设计模式C++学习笔记之十(Builder建造者模式)
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数.详细的还是看代码吧. 10.1.解释 ...
- 创建型模式之Builder(建造者)模式
GitHub地址:https://github.com/zhangboqing/design-mode/tree/master/src/main/java/com/zbq 一.定义 建造者模式 ...
- Builder 建造者模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 8、Builder 建造者模式 组装复杂的实例 创造型模式
1.什么是Builder模式 定义: 将一个复杂对象的构建与表示相分离,使得同样的构建过程可以创建不同的表示.大白话就是,你不需要知道这个类的内部是什么样的,只用把想使用的参数传进去就可以了,达到了解 ...
- js原生设计模式——6复杂对象的构建—Builder建造者模式
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
随机推荐
- year:2017 month:7 day:18
2017-07-18 JavaScript 1javascript的控制语句 (1) if语句 (2)if(){}else 语句 (3) if(){} else if(){ }语句 (4)switch ...
- 框架 之 -------Spring
目录一.Spring工作原理 二.为什么要用Spring三.请你谈谈SSH整合四.介绍一下Spring的事务管理五.什么是依赖注入,依赖注入的作用是什么? 六.什么是AOP,AOP的作用是什么? 七. ...
- HttpURLConnection getInputStream异常的解决
http://blog.csdn.net/q2232/article/details/48136973 但是当getResponseCode为自定义值,比如422时,httpURLConnection ...
- Redis-位图法实现简单统计
比如一个网站有1亿个用户, 现在要统计一周内连续登录的用户 方法: 可以用一个字节8个位表示7个人, 首位不算固定为0, 若某人周一登录则置为1, 没登录则为0 127.0.0.1:6379> ...
- python扫描proxy并获取可用代理ip
今天咱写一个挺实用的工具,就是扫描并获取可用的proxy 首先呢,我先百度找了一个网站:http://www.xicidaili.com 作为例子 这个网站里公布了许多的国内外可用的代理的ip和端口 ...
- list集合为空或为null的区别
简述 判断一个list集合是否为空,我们的惯性思维是判断list是否等于null即可,但是在Java中,list集合为空还是为null,这是两码事. 新建一个list对象,默认值是空,而非null: ...
- 常用类:String,StringBuffer,StringBuilder
String String类被final修饰符修饰,所以不能将其进行继承,所有对它的改变都要重新创建一个新的地址 1.String的构造器 String() String(byte []bytes)/ ...
- Can not issue data manipulation statements with executeQuery().解决的方法
query是查询用的,而update是插入和更新,删除修改用的. executeQuery()语句是用于产生单个结果集的语句,如select语句,在什么情况下用,当你的数据库已经保存了数据后,要进行查 ...
- NYOJ 5 Binary String Matching
Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alp ...
- public static void main(string[] args)解释
这个问题困扰我好久了,今天就一查究竟,毕竟我好奇心比较重 1. why “public” 因为Java程序是通过jvm虚拟机调用的,所以main()函数要是想被调用,必须是public 2.why “ ...