java23种设计模式之四:建造者模式
在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如:在新招收一个员工时,对个人信息对象的创建,在不同的阶段,需要个人信息的内容也不一样,姓名、性别、年龄等等这些基本的信息在一开始就要被创建,但是当加入公司后会有其它其它属性,如:行政级别、公司邮箱、工资等属性 时,就需要后期对其添加。
对于这种对象的创建,我们不能再用前面的工厂方法模式对其创建了,只有建造者模式才可以更好的描述和创建此类对象。
一.介绍
定义:
指将一个复杂对象的构造与它持有的属性分离,使同样的构建过程可以创建不同的属性的对象,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象创建,。它将变与不变相分离,即对象的组成部分是不变的,但是创建对象的每一个属性都是可以灵活选择的。
优点:
各个具体的建造者相互独立,有利于系统的扩展。
客户端不必知道产品内部组成的细节,便于控制细节风险。
缺点:
对象的组成部分必须相同,这限制了其使用范围。
如果对象的内部变化复杂,该模式会增加很多的建造者类。
建造者(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种设计模式之四:建造者模式的更多相关文章
- java的23种设计模式之建造者模式
场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...
- 实践GoF的23种设计模式:建造者模式
摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- 【Unity3D与23种设计模式】建造者模式(Builder)
GoF中定义: "将一个复杂的构建流程与它的对象表现分离出来,让相同的构建流程可以产生不同的对象行为表现." 建造者模式可以分为两个步骤来实施: 1.将复杂的构建流程独立出来,并将 ...
- java设计模式之四建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...
- c# 24种设计模式4建造者模式(Builder)
先来一个例子 建造者接口 public interface IBuilder { void CreateLogo(); void CreateBody(); void CreateWheel(); v ...
- 23种设计模式之建造者模式(Builder)
建造者模式强调将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示.建造者模式是一步一步地创建一个复杂的对象,它允许用户只通过制定复杂对象的类型和内容就可以构建它们,用户不需要知道 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- Java--23种设计模式之decorator模式
装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...
随机推荐
- 解决ubuntu安装软件has install-snap change in progress错误
解决ubuntu安装软件has install-snap change in progress错误 2018年05月06日 13:45:39 山间明月江上清风_ 阅读数:14316 标签: ubunt ...
- jQuery系列(九):JS的事件流的概念
1.事件概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件.想要知道这些事件是在 ...
- 1.4 JAVA日期处理
一.JAVA日期 参考链接:https://www.runoob.com/java/java-date-time.html 1.日期两个构造函数 1.第一个构造函数使用当前日期和时间来初始化对象.Da ...
- Dubbo API 笔记——Dubbo架构与使用
转载于: https://blog.csdn.net/benhuo931115/article/details/78457149 架构演变 单一应用架构 所有功能部署在一个应用上,用于简化增删改查工作 ...
- HTTP缓存机制和原理
前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能.但是对于很多前端同 ...
- 更新ubuntu的对应源配置文件
UBUNTU中安装依赖包,出现如下错误:E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/o ...
- python 利用python的subprocess模块执行外部命令,获取返回值
有时执行dos命令需要保存返回值 需要导入库subprocess import subprocess p = subprocess.Popen('ping www.baidu.com', shell= ...
- sentinel备忘
git https://github.com/alibaba/Sentinel https://github.com/dubbo/dubbo-sentinel-supportdubbo http: ...
- Failed to execute aapt
Failed to execute aapt 没错,看到这个表示你的资源出错了.不用想别的. 比如: Failed to execute aapt com.android.ide.common.pro ...
- 封装带SSH跳板机的MYSQL
一.封装带SSH跳板机的MYSQL 二.配置settting import pymysql from sshtunnel import SSHTunnelForwarder class MyDb(ob ...