建造模式

建造模式属于对象创建型模式,建造模式的目的为将复杂对象的构建过程与其部件实现方式分离,使得同样的构建过程可以有不同的表示,同时相同的构建过程也能够适用于不同的部件实现方式。

建造模式的适用性

建造模式主要适用于以下情况:

  • 当需要复杂对象的创建方法应该独立于该对象的组成部分的构造方法时。
  • 当构造算法必须能够接受被构造的对象使用相同的构造算法有不同的对象表示时。

建造模式的具体实现结构

在上述结构图中,我们可以看到建造模式总共有4个角色:

1、Builder(抽象建造者)角色:抽象建造者为创建Product对象的各个组成部分提供接口。

2、ConcreteBuilder(具体建造者)角色:具体建造者角色通过实现抽象建造者的每个BuildPart方法,并且在对象建造完成后返回结果实例。每一个具体建造者都负责一类产品对象的各个组成部分的建造方法,每一个具体建造者的方法只需要写一次,多个不同的Director(导向器)角色都可以调用生成同一类型下不同的产品。

3、Director(导向器)角色:通过复杂的算法调用具体建造者的方法建造出相应的产品对象。需要说的是同一个导向器实例可以调用不同具体建造者实例的方法构建出不同的产品对象,其中不同具体建造者的方法不能组合使用来构建对象。

4、Procdute(产品)角色:建造模式产生的复杂对象就是产品角色。一个建造模式中可能会有很多个不同类型的产品,每个产品实现的接口都不相同,所以产品角色没有必要抽象出通用的接口。

建造模式的应用

  我们平时画一个人要画他的头、手、身体、脚,这些是一个人的组成部分,固定需要画的。我们可以抽象出一个画头、手、身体、脚的接口出来,具体怎么画人可以再通过抽象出来的接口来定。比如说:普通一点的就是一个头、一个身体、两只手、两只脚,但是也可以画出一个人有三头六臂得人等等。下面我们定义一个抽象方法给出实现一个人身上的各个部件:

public abstract class PersonBuilder {
public abstract void buileHead(); public abstract void buildLeftHand(); public abstract void buildRightHand(); public abstract void buledBody(); public abstract void buileLeftLeg(); public abstract void buileRightLeg(); public abstract Person getResult(); }

下面定义一个构造人类的类继承抽象类PersonBuilder,分别实现头、身体、手、大腿这些部件的构建。

public class HumanBuilder extends PersonBuilder {

    Person person =new Person();
@Override
public void buileHead() {
System.out.println("画一个人类的头");
person.setHead("人类的头");
} @Override
public void buildLeftHand() {
System.out.println("画一个人类的左手");
person.setLeftHand("人类的左手");
} @Override
public void buildRightHand() {
System.out.println("画一个人类的右手");
person.setRightHand("人类的右手");
} @Override
public void buledBody() {
System.out.println("画一个人类的身体");
person.setBody("人类的身体");
} @Override
public void buileLeftLeg() {
System.out.println("画一个人类的左腿");
person.setLeftLeg("人类的左腿");
} @Override
public void buileRightLeg() {
System.out.println("画一个人类的右腿");
person.setRightLeg("人类的右腿");
}
@Override
public Person getResult(){
return person;
}
}

产品类Person

public class Person {

    private String Head;
private String LeftHand;
private String RightHand;
private String Body;
private String LeftLeg;
private String RightLeg; public String getHead() {
return Head;
} public void setHead(String head) {
Head = head;
} public String getLeftHand() {
return LeftHand;
} public void setLeftHand(String leftHand) {
LeftHand = leftHand;
} public String getRightHand() {
return RightHand;
} public void setRightHand(String rightHand) {
RightHand = rightHand;
} public String getBody() {
return Body;
} public void setBody(String body) {
Body = body;
} public String getLeftLeg() {
return LeftLeg;
} public void setLeftLeg(String leftLeg) {
LeftLeg = leftLeg;
} public String getRightLeg() {
return RightLeg;
} public void setRightLeg(String rightLeg) {
RightLeg = rightLeg;
}
}

  最后通过一个PersonDirector引导器来完成一个人的组装构建,通过调用HumanBuilder的方法通过不同的算法可以组建一个有一个头、两个手、一个身体、两只脚的正常人,也可以构建出一个拥有三头六臂的神人,还可以构建出一位只有一只手的残疾人,这就是我们所说的通过不同的构建方法调用同一个建造器可以得到不同的表示。同样的道理还可以再定义一个外星人的AlienBuilder建造器,通过组装个头、两个手、一个身体、两只脚的人类的组装方法得到与人类完全不同的外星人对象。

  所以说不同的构造方法可以得到复杂对象的不同表示,相同的构造方法也可以创造出不同的对象的表示。

  下面给出一种组装一个头、两个手、一个身体、两只脚的正常人的构造方法。

public class PersonDirector {
private PersonBuilder personBuilder; public PersonDirector(PersonBuilder personBuilder) {
this.personBuilder = personBuilder;
} public void CreatePerson() {
personBuilder.buileHead();
personBuilder.buildLeftHand();
personBuilder.buildRightHand();
personBuilder.buledBody();
personBuilder.buileLeftLeg();
personBuilder.buileRightLeg();
}
}

Clien调用

public class Client {
public static void main(String[] args) {
PersonBuilder personBuilder = new HumanBuilder();
PersonDirector personDirector = new PersonDirector(personBuilder);
personDirector.CreatePerson();
Person person = personBuilder.getResult()
}
}
画一个人类的头
画一个人类的左手
画一个人类的右手
画一个人类的身体
画一个人类的左腿
画一个人类的右腿

总结

  建造模式可以很轻易的就改变一个产品的内部表示,通过定义一个新的生成器在客户端就可以调用不同的生成器产生不同的对象表示;同时建造模式也将产品的构建过程和表示分离开,使得客户不用知道一个产品的内部构造是什么样的,只需要调用生成器的接口就可以建造出一个需要的对象;最后建造模式可以使得使用者能够对产品的构建过程进行更加精确的控制,通过导向器一一步一步的建造出一个复杂的对象。

  建造模式和抽象工厂模式的区别在于建造模式更加注重的是一步一步构建产品的过程,而抽象工厂模式更加注重一系列相关联的产品部件组建出一个产品。建造模式是一步一步的构建产品,而抽象工厂模式是立即就生成对象。

java设计模式--建造模式的更多相关文章

  1. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  2. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  3. linkin大话设计模式--建造模式

    linkin大话设计模式--建造模式 建造模式是对象的创建模式,可以讲一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 建造模式的结构: 抽象建造者 ...

  4. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

  5. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  6. Java设计模式——外观模式

    JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构

  7. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...

  8. 【设计模式】Java设计模式 - 原型模式

    [设计模式]Java设计模式 - 原型模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  9. 【设计模式】Java设计模式 - 桥接模式

    [设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

随机推荐

  1. AndroidManifest中的Intent-filter标签

    经过测试,intent-filter标签中的: 1. <action android:name="android.intent.action.MAIN" /> 代表这是 ...

  2. C/C++的const区别

    1.const基础知识(用法.含义.好处) int main() { const int a; //a为const,常数型数 int const b; //b为const,常数型数 const int ...

  3. poj2728 Desert King——01分数规划

    题目:http://poj.org/problem?id=2728 第一道01分数规划题!(其实也蛮简单的) 这题也可以用迭代做(但是不会),这里用了二分: 由于比较裸,不作过多说明了. 代码如下: ...

  4. C# HTML解析工具HtmlAgilityPack使用实例(一)

    一.生成HTML字符串 //生成DOM字符串结构 HtmlNode container = HtmlNode.CreateNode("<div />"); HtmlNo ...

  5. 解决warning: LF will be replaced by CRLF in **(filename)

    使用Windows的Git使用 git add 时出现warning: LF will be replaced by CRLF in **(filename) 原因: CRLF -- Carriage ...

  6. 简单易用"里程碑"、"时间轴"<iOS小组件>

    非常感谢,帮助我的朋友们,谢谢你们.上次我的好朋友指出了我编码上(jwTextFiled工具组件)存在一些不规范问题,这次注意提高. 呆毛地址:https://github.com/NIUXINGJI ...

  7. 如何在ubuntu下使用windows下的程序(eg: .exe)

    为了在ubutu下安装百度云管家,上网查了下如何在ubuntu 下安装.exe文件,其中遇到一些问题记录如下: 使用的命令: 开始时直接使用的sudo apt-get install wine 在运行 ...

  8. MongoDB -- 安装(win 10)

    1. 下载安装包: mongodb-win32-x86_64-2008plus-ssl-4.0.10-signed.msi https://www.mongodb.com/download-cente ...

  9. B. One Bomb (#363 Div.2)

    B. One Bomb time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  10. 2.SJ-SLAM-14

    第三讲 三维空间刚体运动 本讲目标 理解三维空间的刚体运动描述方式:旋转矩阵.变换矩阵.四元数和欧拉角. 掌握Eigen库的矩阵.几何模块使用方法. 3.1 点.向量和坐标系,旋转矩阵 二维空间与三维 ...