建造者模式 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.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
随机推荐
- Mysql数据库安装与配置
先介绍下dql,dml,ddl,dcl: 安装: 加上这一行: 接下来把mysql设置成随系统自动启动: 开放3306端口(如果是阿里云服务器需要修改安全规则而不是如下): 或者 这里注意,有时候没有 ...
- centos LNMP第一部分环境搭建 LAMP LNMP安装先后顺序 php安装 安装nginx 编写nginx启动脚本 懒汉模式 mv /usr/php/{p.conf.default,p.conf} php运行方式SAPI介绍 第二十三节课
centos LNMP第一部分环境搭建 LAMP安装先后顺序 LNMP安装先后顺序 php安装 安装nginx 编写nginx启动脚本 懒汉模式 mv /usr/local/php/{ ...
- 认识与设计Serverless(二)
一.设计Serverless的功能模块 第一节讲了Serverless一些概念与特性,废话居多,概念的东西了解过后要有设计与构思,才能学到精髓,一个Serverless平台的形成,涉及到很多模块的架构 ...
- Smarty小结提纲
Smarty:模板技术 实现功能:前后分离. 原理:主要通过Smarty核心类实现,调用display方法,将模板文件读取,用正则进行替换,替换完保存到临时文件,将临时文件加载到当前页面. 配置文件( ...
- mysql锁机制之综述(一)
https://zhuanlan.zhihu.com/p/29150809 一.数据库有锁机制的原因. 数据库锁定机制简单来说,就是数据库为了保证数据的一致性和有效性,而使各种共享资源在被并发访问变得 ...
- 2018-2019 ACM-ICPC, Asia Seoul Regional Contest
ProblemA Circuits Solved. 题意: 有$n$个矩形,可以放两条平行与$x$轴的线,求怎么放置两条无线长的平行于$x$轴的线,使得他们与矩形相交个数最多 如果一个矩形同时与两条线 ...
- 两个星期,用Flutter撸个APP
前言 Flutter是Google推出的跨平台的解决方案,Slogan是"Design beautiful apps",国内也有知名企业在使用和推广,例如阿里.美团都有在尝试. 个 ...
- EditPlus 4.3.2473 中文版已经发布(10月21日更新)
新的 EditPlus 修复了如下问题: * Ctrl+鼠标拖放文本功能异常 * 上传文件到 FTP 服务器失败后将弹出对话框,可重试上传 * 列选模式下粘贴到现存的选中内容时文本错乱的问题 本博客已 ...
- 使用spring cache和ehcache之前必须了解的
好长时间没写博客了,真的是没时间啊.ps:其实就是懒!!接下来几篇要写下缓存,这里主要写下ehcache与spring整合的内容,包括aop形式的缓存,基于注解的缓存,页面缓存这三方面吧.在这之前先要 ...
- scp命令简单应用
实例1:从远处复制文件到本地目录 $scp root@10.6.159.147:/opt/soft/demo.tar /opt/soft/ 说明: 从10.6.159.147机器上的/opt/soft ...