在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如:在新招收一个员工时,对个人信息对象的创建,在不同的阶段,需要个人信息的内容也不一样,姓名、性别、年龄等等这些基本的信息在一开始就要被创建,但是当加入公司后会有其它其它属性,如:行政级别、公司邮箱、工资等属性 时,就需要后期对其添加。
  对于这种对象的创建,我们不能再用前面的工厂方法模式对其创建了,只有建造者模式才可以更好的描述和创建此类对象。

一.介绍

  定义:
  指将一个复杂对象的构造与它持有的属性分离,使同样的构建过程可以创建不同的属性的对象,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象创建,。它将变与不变相分离,即对象的组成部分是不变的,但是创建对象的每一个属性都是可以灵活选择的。

优点:
  各个具体的建造者相互独立,有利于系统的扩展。
  客户端不必知道产品内部组成的细节,便于控制细节风险。

缺点:
  对象的组成部分必须相同,这限制了其使用范围。
  如果对象的内部变化复杂,该模式会增加很多的建造者类。

  建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

总述:

  在不同阶段创建不同的对象属性

结构
  对象原型 (Persion): 原始对象所具有的多种属性,这个可以结合业务属性来定义
  建造者角色(Builder): 它是一个要创建对象原型的内部类,它有与对象原型相同的属性,有创建初始对象的构造方法,并且还有一个返回原型对象的builder方法

二.实现原理

  通过访问静态内部的形式得到内部类,内部类通过有参方法将传入的参数赋值给静态内部类对象,外部类私有构造函数,参数设置成静态内部类对象当静态内部类对象通过无参的build方法获得外部类时,外部类构造函数需要传入静态内部类实例对象,此时,精彩的来了,因为通过访问静态内部的方法获得了内部类对象,而在调用build方法时需要传入内部类对象,而在外部类的私有构造中传入的是静态内部类对象,因此build方法之前全是静态内部类对象,而在build时,确将自己当成参数传入外部类的构造函数中,通过外部类的构造函数里的赋值,得到了外部类对象的实例。

  仔细想想,将自己当成参数传入确实精彩

三.应用场景

  当要创建的对象一次不能完全初始化完成,有的属性需要通过后期才能将其初始化完成的,可以用此设计模式

四.代码实现

//原型对象
public class Persion {
private String name; //姓名
private int age; //年龄
private String gender; //性别
private String email; //邮箱
private String level; //行政级别
private double salary; //工资 public Persion (Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.gender = builder.gender;
this.email = builder.email;
this.level = builder.level;
this.salary = builder.salary; } public Persion email(String email) {
this.email = email;
return this;
} public Persion level(String level) {
this.level = level;
return this;
} public Persion salary(double salary) {
this.salary = salary;
return this;
} @Override
public String toString() {
return "Persion [name=" + name + ", age=" + age + ", gender=" + gender + ", email=" + email + ", level=" + level
+ ", salary=" + salary + "]";
}
//实际建造者对象
static class Builder{
private String name; //姓名
private int age; //年龄
private String gender; //性别
private String email; //邮箱
private String level; //行政级别
private double salary; //工资 public Builder(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
} public Persion builder() {    //这个方法相当精彩,哪个要创建的对象调用builder方法,就将自己作为参数去构造persion对象
return new Persion(this);
}
}
}

测试类

public class BuilderPattern {

    public static void main(String[] args) {
//入职前张三的基本信息
Persion builder = new Persion.Builder("张三",23,"男").builder();
System.out.println("加入公司之前 : "+builder); //入职后张三的附加信息
builder.email("123@qq.com").level("hight-level").salary(10000.0);
System.out.println("加入公司之后 : "+builder);
}
}

java23种设计模式之四:建造者模式的更多相关文章

  1. java的23种设计模式之建造者模式

    场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...

  2. 实践GoF的23种设计模式:建造者模式

    摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...

  3. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  4. 【Unity3D与23种设计模式】建造者模式(Builder)

    GoF中定义: "将一个复杂的构建流程与它的对象表现分离出来,让相同的构建流程可以产生不同的对象行为表现." 建造者模式可以分为两个步骤来实施: 1.将复杂的构建流程独立出来,并将 ...

  5. java设计模式之四建造者模式(Builder)

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...

  6. c# 24种设计模式4建造者模式(Builder)

    先来一个例子 建造者接口 public interface IBuilder { void CreateLogo(); void CreateBody(); void CreateWheel(); v ...

  7. 23种设计模式之建造者模式(Builder)

    建造者模式强调将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示.建造者模式是一步一步地创建一个复杂的对象,它允许用户只通过制定复杂对象的类型和内容就可以构建它们,用户不需要知道 ...

  8. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  9. Java--23种设计模式之decorator模式

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...

随机推荐

  1. yarn是什么?

    yarn是个包管理器.你可以通过它使用全世界开发者的代码, 或者分享自己的代码. 从 npm 安装软件包并保持相同的包管理流程. 优点:         1.速度超快. Yarn 缓存了每个下载过的包 ...

  2. more/less

    more less

  3. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  4. node中的http内置模块

    Node.js开发的目的就是为了用JavaScript编写Web服务器程序.因为JavaScript实际上已经统治了浏览器端的脚本,其优势就是有世界上数量最多的前端开发人员.如果已经掌握了JavaSc ...

  5. 让一个小的div在大的div中居中显示

    原文 实现原理是设置margin自动适应,然后设置定位的上下左右都为0. 就如四边均衡受力从而实现盒子的居中: 代码: .parent { width:800px; height:500px; bor ...

  6. 【转载】Python tips: 什么是*args和**kwargs?

    转自Python tips: 什么是*args和**kwargs? 先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwa ...

  7. mysql zip方式安装

    下载zip文件解压到安装目录,此时是没有data文件夹和my.ini文件的. 1.首先自己新建my.ini,内容如下: [client] port=3306 default-character-set ...

  8. 慎用String.intern()作为synchronized的对象锁

    https://www.cnblogs.com/yhlx/p/3498387.html

  9. selector状态选择器

    Selector selector就是状态选择器(StateList),它分为两种,一种Color-Selector 和Drawable-Selector. Color-Selector color- ...

  10. 日志文件---log4j.properties

    ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.a ...