开心一刻:

同事妻管严,零花钱少的可怜,今天一起打牌他输了400块没钱了。想想也可怜,就请他吃饭,吃饭时他说兄弟借十块钱吧,买张请柬回去好报帐,我当时就呆了,又TM学会一招。。。

简言:

建造者模式定义:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要一个模式,“建造者模式”,又叫生成器模式,建造者模式可以将一个产品内部表现与产品的生成过程分割,从而可以使一个建造过程生成具有不同的内部表现的产品对象,如果我们用了建造者模式,用户只需要指定需要建造的类型就可以得到他,具体的建造的过程就不需要知道了。

建造者模式的使用

我们以创建“人”来做案例,头,身体,左手,右手,左脚,右脚。

所以我们想定义一个抽象的建造人的类,稳定了建造人的过程,通过抽象类,实现特有的抽象方法,保证不遗留建造零件(例如每个左腿)

代码展示:

创建一个人的实体bean

public class Pen {private String head;private String body;private String armLeft;private String armRight;private String legLeft;private String legRight;public String getHead() {return head;}public void setHead(String head) {this.head = head;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}public String getArmLeft() {return armLeft;}public void setArmLeft(String armLeft) {this.armLeft = armLeft;}public String getArmRight() {return armRight;}public void setArmRight(String armRight) {this.armRight = armRight;}public String getLegLeft() {return legLeft;}public void setLegLeft(String legLeft) {this.legLeft = legLeft;}public String getLegRight() {return legRight;}public void setLegRight(String legRight) {this.legRight = legRight;}
}

创建人的抽象类

public abstract class PersonBuilder {private Pen p;public PersonBuilder(Pen p) {this.p = p;}public abstract void BuildHead();public abstract void BuildBody();public abstract void BuildArmLeft();public abstract void BuildArmRight();public abstract void BuildLegLeft();public abstract void BuildLegRight();
}

在建造者模式中还有一个很重要的类,指挥者(Director) 用它来控制建造过程,也用它来隔离用户与建造过程的关联。

废话少说上代码:

public class PersonDirector {private PersonBuilder pb;/*** 用户告诉指挥者,我需要建造什么样的人* */public PersonDirector(PersonBuilder pb) {this.pb = pb;}/*** 根据用户的选择建造人* */public void CreatePerson(){pb.BuildHead();pb.BuildBody();pb.BuildArmLeft();pb.BuildArmRight();pb.BuildLegLeft();pb.BuildLegRight();}
}

我们接下来创建人,一个廋子 和 一个胖子,让这个廋子和胖子继承这个抽象类,重写这些抽象方法。

public class PersonFatBuilder extends PersonBuilder{public PersonFatBuilder(Pen p) {super(p);}@Overridepublic void BuildHead() {System.out.println("创建一个胖的头-----");}@Overridepublic void BuildBody() {System.out.println("创建胖的身体-----");}@Overridepublic void BuildArmLeft() {System.out.println("创建胖的左手-----");}@Overridepublic void BuildArmRight() {System.out.println("创建胖的右手-----");}@Overridepublic void BuildLegLeft() {System.out.println("创建胖的左腿-----");}@Overridepublic void BuildLegRight() {System.out.println("创建胖的右腿-----");}
}
public class PersonThinBuilder extends PersonBuilder {public PersonThinBuilder(Pen p) {super(p);}@Overridepublic void BuildHead() {System.out.println("创建一个廋的头-----");}@Overridepublic void BuildBody() {System.out.println("创建廋的身体-----");}@Overridepublic void BuildArmLeft() {System.out.println("创建廋的左手-----");}@Overridepublic void BuildArmRight() {System.out.println("创建廋的右手-----");}@Overridepublic void BuildLegLeft() {System.out.println("创建廋的左腿-----");}@Overridepublic void BuildLegRight() {System.out.println("创建廋的右腿-----");}
}

最后我们实现客户端的代码;

    /*** 创建一个廋的人* */Pen p = new Pen();PersonThinBuilder personThinBuilder = new PersonThinBuilder(p);PersonDirector  personDirector = new PersonDirector(personThinBuilder);personDirector.CreatePerson();/*** 创建一个胖的人* */Pen pFat = new Pen();PersonFatBuilder personFatBuilder = new PersonFatBuilder(pFat);PersonDirector  personDirectorFat = new PersonDirector(personFatBuilder);personDirectorFat.CreatePerson();

输出的结果如下:

如果我们需要增加一个高的和矮的人,我们怎么做?

只需要在加两个类,来实现PersonBuilder这个抽象类,吼  吼

建造者模式分析

通过这结构图,来分析一下Builder是什么?

是为了创建一个product对象各个部件指定的抽象接口。

ConcreteBuilder是什么那?

它是具体建造者,实现Builder接口,构造和装配各个部件,Product当然就是那些具体的产品。

Director是什么那?

指挥者,它是构建一个使用Builder接口对象,

在什么时候需要使用建造者模式呢?

它主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但建造通常面临着复杂的变化。

建造者模式是在当前创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。

面试官都爱问的java模式之建造者模式!!!相关推荐

  1. 面试官都爱问的java模式之装饰模式!!!

    简言: Java中的23种设计模式: Factory(工厂模式),Singleton(单例模式),Adapter(适配器模式),FactoryMethod(工厂方法模式),Prototype(原始模型 ...

  2. java 实体类包含list 怎么取值_舅舅是面试官,偷偷告诉你们面试官最爱问的Java面试题...

    2015 年,因为工作岗位的变动,舅舅开始负责给集团招聘一些技术人员,出于对公司的负责,也为了更好的胜任技术经理的职位,在面试的这件事上,舅舅做了大量的"功课",首先研究了几乎所有 ...

  3. 面试 HTTP ,99% 的面试官都爱问这些问题!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 本文来源:Java建设者 HTTP 和 HTTPS 的区别 HTT ...

  4. 为什么面试官都爱问源码?这几个公众号告诉你!

    技术之路就是漫长的打怪升级,不断学习前人的踩坑经验才能提升自己,切忌闭门造车.所谓独乐乐不如众乐乐,强烈推荐以下公众号,让你的生活多点意思????,希望小伙伴们能在 coding 的路上走的更远. 「 ...

  5. 面试 HTTP ,99% 的面试官都爱问这些问题

    HTTP 和 HTTPS 的区别 HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字.图片.音频.视频等超 ...

  6. 面试官最爱问的并发问题

    转载自  面试官最爱问的并发问题 在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(J ...

  7. 面试官最爱问的Redis(三)Redis的基本知识

    面试官最爱问的redis,继续整理了Redis的学习笔记,动力节点的redis视频,13个小时搞定redis,笔记分享给大家. 视频资源:https://www.bilibili.com/video/ ...

  8. 面试官都在问 | Linux命令mpstat详解

    面试官都在问 | Linux命令mpstat详解 1. mpstat的基本用法 mpstat的全称为Multiprocessor Statistics,是一款常用的多核CPU性能分析工具,用来实时查询 ...

  9. 阿里的面试官都喜欢问哪些问题?

    作者:徐刘根 | 公众号:Java之间 金九银十是招聘的旺季,小编在这里也给大家整理了一套阿里面试官最喜欢问的问题或者出场率较高的面试题,助校招或者社招路上的你一臂之力! 首先我们需要明白一个事实,招 ...

最新文章

  1. 为什么大型科技公司更会发生人员流失 标准 ceo 软件 技术 图 阅读2479 原文:Why Good People Leave Large Tech Companies 作者:steve
  2. [转]第(前)k大数问题
  3. 艾媒:第三方应用商店形成BAT3争霸格局
  4. c#设置开机自动启动程序本篇文章来源于:
  5. 「mac版」支持flash的浏览器,谷歌浏览器Chrome、火狐浏览器Firefox
  6. java基础知识5-二进制
  7. java servlet api.jar_servlet-api.jar包下载
  8. Matlab编写摩斯代码,以摩斯电码为例为 Arduino 编写库
  9. 机械手三维图 matlab,机械手的三维建模
  10. 众泰Z700导航升级高德地图
  11. typedef 定义结构体说明
  12. 一款精简的webshell管理工具 -- Assassin
  13. Android键盘输入法(一)——键盘类型
  14. git常用操作--分支同步master 本地库提交到远程分支
  15. springboo+elasticsearch+经纬度查询
  16. 网格设计版式设计_网页设计展示精美的版式
  17. 矩阵运算库 C语言 (Matrix_hub)
  18. 通信接口:RS-232 / RS-422 / RS-485三者概述与区别
  19. python-对象类型
  20. Feeds流的设计与实现

热门文章

  1. php 服務器連接,cocos2d-x網絡編程 連接php服務器筆記4
  2. Java 常用的工具类—判断Excel版本读取Excel/CSV文件
  3. 埃森哲报告解读 | 见微知著,把握中国消费市场新常态
  4. Windows10输入法繁体简体切换
  5. 【Web动画】CSS3 3D 行星运转 浏览器渲染原理
  6. 小学学计算机应该学什么礼物,小学生毕业送什么礼物好?小学毕业礼物排行榜推荐...
  7. 如何在Visual Studio代码中隐藏侧栏中的某些文件?
  8. 一文看懂文旅地产数字转型三大战略
  9. 商品交易系统之---产品介绍
  10. 微信小程序联盟:官方文档+精品教程+demo集合(未完待续,持续更新中……)