建造者模式 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.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
随机推荐
- Nginx反向代理服务器安装与配置
一.服务器安装: sudo yum install gcc-c++ sudo yum install pcre pcre-devel sudo yum install zlib zlib-devel ...
- drawable转mitmap 以及图片base64编码
static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap { int width = drawable.getIn ...
- Swagger2 生成 Spring Boot API 文档
Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.本文主要介绍了在 Spring Boot 添加 Swagger 支持, 生成可自动维护的 A ...
- PAT 1128 N Queens Puzzle[对角线判断]
1128 N Queens Puzzle(20 分) The "eight queens puzzle" is the problem of placing eight chess ...
- stringbuffer 和 stringbuilder区别
stringbuffer 和 stringbuilder速度 小于 线程安全 线程非安全 单线程操作大量数据用stringbui ...
- php之isset empty is_null的区别
isset:当前变量没有设置(即不存在),或者变量设置为null的时候,返回true,设置为“”或者0 都是返回的true empty:变量不存在,设置值为null,设置为“”,设置为0 都返回tru ...
- Java 强引用、软引用、弱引用、幻象引用有什么区别
1)引用出现的根源 引用出现的根源是由于GC内存回收的基本原理.GC回收本质上是回收对象.目前比较流行的回收算法是可达性分析算法.从GC roots开始安装一定的逻辑判断一个对象是否可达,不可达的话就 ...
- postman 做接口测试
Postman 之前是作为Chrome 的一个插件,现在要下载应用才能使用. 以下是postman 的界面: 各个功能区的使用如下: 快捷区: 快捷区提供常用的操作入口,包括运行收藏夹的一组测试数据, ...
- Jedis连接池
jedis是官方首选的java客户端开发包 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Ja ...
- HDU 6156 Palindrome Function(数位DP)题解
思路: 数位dp的操作是dfs+记忆化,我们dp开四维:位置,长度,进制,是否回文.然后每次暴搜记录下每个位置的数字是什么,搜到对称轴另一边需要检查是否符合回文. 终于把友谊赛的题目都补完了...没做 ...