建造者模式 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.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
随机推荐
- http和socket之长连接和短连接区别
TCP/IP TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应 ...
- CentOS7.0安装Nginx 1.10.0
首先由于nginx的一些模块依赖一些lib库,所以在安装nginx之前,必须先安装这些lib库,这些依赖库主要有g++.gcc.openssl-devel.pcre-devel和zlib-devel ...
- Hyperledger Fabric 开发环境搭建 centos7系统
一.安装GO语言 下载最新版的go 打开Terminal,输入命令(以下命令都是以root管理员的角色进行的) su 输入密码:***** wget https://storage.googleapi ...
- 线程,协程,IO模型
理论: 1.每创造一个进程,默认里面就有一个线程 2.进程是一个资源单位,而进程里面的线程才是CPU上的一个调度单位 3.一个进程里面的多个线程,是共享这个进程里面的资源的 4.线程创建的开销比进程要 ...
- EditPlus 4.3.2477 中文版已经发布(11月3日更新)
新的版本修复了之前版本文本库和自动完成功能中的“^!”符号在填充项前面时不能正常工作的问题.
- 883. Projection Area of 3D Shapes
问题 NxN个格子中,用1x1x1的立方体堆叠,grid[i][j]表示坐标格上堆叠的立方体个数,求三视图面积. Input: [[1,2],[3,4]] Output: 17 Explanation ...
- SpringCloud配置
encrypt说明 名称 默 认 描述 encrypt.fail-on-error true 标记说,如果存在加密或解密错误,进程将失败. encrypt.key 对称密钥.作为一个更强大的替代方 ...
- 常用技巧之JS判断数组中某元素出现次数
先上代码:function arrCheck(arr){ var newArr = []; for(var i=0;i<arr.length;i++){ var temp=arr[i] ...
- 用python解析word文件(段落篇(paragraph) 表格篇(table) 样式篇(style))
首先需要安装相应的支持库: 直接在命令行执行pip install python-docx 示例代码如下: import docxfrom docx import Document #导入库 path ...
- Python3:sqlalchemy对sybase数据库操作,非sql语句
Python3:sqlalchemy对sybase数据库操作,非sql语句 # python3 # author lizm # datetime 2018-02-01 10:00:00 # -*- c ...