建造者模式 build
引出建造者模式:
package com.disign.build; /**
* Created by zhen on 2017-05-19.
*/
public class BuildPersonTest {
/**
* 吃面,面的口味与厨师的心情等关联引出:
* 抽象不应该依赖于细节,细节应该依赖于抽象,吃的菜不能依赖于厨师的细节。
* 构建小人
* 防止哪次构建的时候小人少了哪个必要组件,应该使用抽象继承
*/
public static void main(String[] args){ Person thin = BuildPerson.build(new ThinPerson());
Person fat = BuildPerson.build(new FatPerson());
} }
class BuildPerson{ public static Person build(Person person){
person.buildHead();
person.buildBody();
person.buildArmLeft();
person.buildArmRight();
person.buildLegLeft();
person.buildLegRight();
return person;
} }
abstract class Person{
abstract void buildHead();
abstract void buildBody();
abstract void buildArmLeft();
abstract void buildArmRight();
abstract void buildLegLeft();
abstract void buildLegRight();
}
class FatPerson extends Person{
@Override
void buildHead() { } @Override
void buildBody() { } @Override
void buildArmLeft() { } @Override
void buildArmRight() { } @Override
void buildLegLeft() { } @Override
void buildLegRight() { }
}
class ThinPerson extends Person{
@Override
void buildHead() { } @Override
void buildBody() { } @Override
void buildArmLeft() { } @Override
void buildArmRight() { } @Override
void buildLegLeft() { } @Override
void buildLegRight() { }
}
我们上面的代码就用到了建造者模式。
建造小人的过程是稳定的,都需要头身手脚,具体建造的细节不同,有高矮胖瘦。但是对于用户而言,我只告诉你,我需要一个胖小人,我们应该在保证一个正常人的前提下对人的细节进行修饰。
如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示意图的时候,我们可以使用建造者模式,又叫生成器模式。如果我们用了建造者模式,用户只需要指定需要建造的类型就可以得到他们,具体的建造的过程和细节就不需要知道了。
建造者模式Builder,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

图中Builder是什么?
为创建一个Product对象各个部件指定的抽象接口。
ConcreteBuilder是什么?
具体创造的,实现Builder接口,构造和装配各个部件。
Product是什么?
具体的小人,产品角色。
Director是什么?
指挥者,用来根据用户需求构建小人对象,是一个使用Builder接口的对象
什么时候使用构建者模式呢?
用于创建一些复杂的对象,这些对象内部构建之间的构造顺序通常是非常稳定的,单对象内部的构建通常面临着复杂的变化
构造者模式的好处就是使得构造代码与表示代码分离,由于构造者隐藏了该产品是如何组装的,所以弱需要改变一个产品的内部表示,只需要再定一个具体的建构者就可以了。
基本代码:
public class BuildProductTest {
public static void main(String[] args){
Director director = new Director();
BuilderProduct builderProduct1 = new ConcreteBuilder1();
BuilderProduct builderProduct2 = new ConcreteBuilder2();
director.construct(builderProduct1);
Product p1 = builderProduct1.getResult();
p1.show();
director.construct(builderProduct2);
Product p2 = builderProduct2.getResult();
p2.show();
}
}
class Product{
List<String> parts = new ArrayList<String>();
public void add(String part){
parts.add(part);
}
public void show(){
for (String part: parts) {
System.out.println(part);
}
}
}
abstract class BuilderProduct{
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
class ConcreteBuilder1 extends BuilderProduct{
@Override
public void buildPartA() {
}
@Override
public void buildPartB() {
}
@Override
public Product getResult() {
return null;
}
}
class ConcreteBuilder2 extends BuilderProduct{
@Override
public void buildPartA() {
}
@Override
public void buildPartB() {
}
@Override
public Product getResult() {
return null;
}
}
class Director{
public void construct(BuilderProduct builder){
builder.buildPartA();
builder.buildPartB();
}
}
建构者模式是在当创建复杂对象的算法应该独立于该对象的组成以及它们的装配方式时使用的模式。
建造者模式 build的更多相关文章
- 设计模式01 创建型模式 - 建造者模式(Build Pattern)
参考 1. Builder Design Pattern | Youtube 2. 建造者模式(Builder和Director)| 博客园 3. 深入理解Builder模式 | 简书 建造者模式(B ...
- 建造者模式(build pattern)-------创造型模式
将一个复杂对象的构建与它的标示分离,使得同样的构建过程可以创建不同的标示. 建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内 ...
- java设计模式之建造者模式
学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...
- 设计模式--建造者模式Builder(创建型)
一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...
- C#设计模式系列:建造者模式(Builder)
1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率 中低 1.3>.原型模式应用 ...
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- java 建造者模式
package de.bvb.test3; /** * 建造者模式: 假如一个类有4个字段,每个字段或者每几个字段的组合都需要设置为构造函数,构造函数就比较麻烦 * 而且如果再加一个字段进去也不好拓展 ...
- 六个创建模式之建造者模式(Builder Pattern)
定义: 将一个复杂的对象的构建与它的表示分类,使得同样的构建过程可以创建不同的表示.建造者模式一步步地创建一个复杂对象,但用户仅需指定对象的类型和内容,不需要关心各个部分之间的关联关系. 结构图: B ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
随机推荐
- input输入框type=file时accept中可以限制的文件类型(转载)
转载自: input type=file accept中可以限制的文件类型 在上传文件的时候,需要限制指定的文件类型. <input type="file" accept=& ...
- 谈谈ConcurrentHashMap1.7和1.8的不同实现
知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得. ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈 ...
- MySQL server has gone away With statement: INSERT INTO `students`......
mysql出现ERROR : (2006, 'MySQL server has gone away') 的问题意思就是指client和MySQL server之间的链接断开了. 首选分析给出可能出现的 ...
- C# 使用 wkhtmltopdf 把HTML文本或文件转换为PDF
一.简介 之前也记录过一篇关于把 HTML 文本或 HTML 文件转换为 PDF 的博客,只是之前那种方法有些局限性. 后来又了解到 wkhtmltopdf.exe 这个工具,这个工具比起之前的那种方 ...
- Java Exception 和Error有什么区别?
① Exception 和Error 都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型. ② Exception和Error ...
- STM32F105 USB管脚Vbus的处理
源:STM32F105 USB管脚Vbus的处理 对于STM32F105/107来说,为了监测USB的连接问题,程序默认是通过Vbus管脚进行检查的.但是Vbus管脚和UART1的TXD复用,导致我们 ...
- php时间戳函数mktime()
在项目开发中,偶尔会遇到跨周期.跨月的的时间操作.PHP为我们提供了一个很方便的函数->mktime,可以很简单的获取制定日期的时间戳了. mktime(hour,minute,second,m ...
- foo、bar美国版的张三李四
不管看javascript还是其他语言举例,经常看到使用foo和bar来充当变量.那么究竟foo.bar是什么鬼? 一说:foo 和 bar 组合在一起所构成的 foobar 应该最能反映其原始的意思 ...
- 20145307陈俊达《网络对抗》Exp2 后门原理与实践
20145307陈俊达<网络对抗>Exp2 后门原理与实践 基础问题回答 例举你能想到的一个后门进入到你系统中的可能方式? 非正规网站下载的软件 脚本 或者游戏中附加的第三方插件 例举你知 ...
- Ubuntu18.04 怎么开热点
先说明,电脑上要有wifi适配器,而且连接wifi时,不能开热点 我的笔记本是双系统,现在介绍一下我的设置 在设置里打开热点这个应该会吧,但是热点密码不是自己设置的,而是随机生成的,本文重点介绍一下怎 ...