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

一.介绍

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

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

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

  建造者(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. 012_linuxC++之_类的继承定义

    (一)访问控制和继承 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基 ...

  2. MySQL 5.7半同步复制技术

    一.复制架构衍生史 在谈这个特性之前,我们先来看看MySQL的复制架构衍生史. 在2000年,MySQL 3.23.15版本引入了Replication.Replication作为一种准实时同步方式, ...

  3. codeforces#1167F. Scalar Queries(树状数组+求贡献)

    题目链接: https://codeforces.com/contest/1167/problem/F 题意: 给出长度为$n$的数组,初始每个元素为$a_i$ 定义:$f(l, r)$为,重排$l$ ...

  4. [pytorch] 自定义激活函数中的注意事项

    如何在pytorch中使用自定义的激活函数? 如果自定义的激活函数是可导的,那么可以直接写一个python function来定义并调用,因为pytorch的autograd会自动对其求导. 如果自定 ...

  5. 7. 使用Hystrix实现微服务的容错处理

                  使用Hystrix实现微服务的容错处理 7.1. 实现容错的手段 7.1.1. 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整 ...

  6. Python 文件writelines() 方法和处理双层列表

    概述 writelines() 方法用于向文件中写入一序列的字符串. 这一序列字符串可以是由迭代对象产生的,如一个字符串列表. 换行需要制定换行符 \n. 语法 writelines() 方法语法如下 ...

  7. SpringCloud(二)之Ribbon的实现负载均衡的基本应用

    一 Ribbon简介     Ribbon是Netflix发布的负载均衡器,它是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装 ...

  8. SR论文代码汇总

    1.SRCNN 页面  里面有论文,matlab和caffe代码. Tensorflow https://github.com/tegg89/SRCNN-Tensorflow 2.ESPCN 论文链接 ...

  9. C++继承中的属性

    class A { public: int a; A() { } void print() { cout<<a; } }; class B:public A { public: int a ...

  10. 在Eclipse中使用WindowBuilder设计Swing程序

    在Eclipse中使用WindowBuilder设计Swing程序     Swing程序表示Java的客户端窗体程序,除了通过手动编写代码的方式设计Swing程序之外,Eclipse中还提供了一种W ...