建造模式

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

建造模式的适用性

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

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

建造模式的具体实现结构

在上述结构图中,我们可以看到建造模式总共有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. Java 并发 —— volatile 关键字

    volatile 修饰变量等于向编译器传达如下两层含义: 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的. 禁止进行指令重排序. volat ...

  2. python 基础之第四天

    例子1: 打印列表每个元素对应的索引 [root@master script]# vim suoyin.py #!/usr/bin/python # coding:utf-8 alist = ['fu ...

  3. RQNOJ魔法石之恋

    魔法石之恋 (stone.pas/c/cpp) [问题描述] 在<Harry Potter and the Sorcerer's Stone>中,想得到魔法石,必须要通过许许多多的测试和游 ...

  4. javascript之创建对象的方式

    1.object构造函数创建 var obj=new Object(); obj.name='xue'; 2.对象字面量创建 var obj={ name:'xue' } 3.构造函数创建 funct ...

  5. Strom配置说明

    在进群生产环境下运行Topology和在本地模式下运行非常相似.下面是步骤: 1.定义Topology(如果使用Java开发语言,则使用TopologyBuilder来创建) 2.使用StormSub ...

  6. JAVA中的BIO,NIO,AIO

    在了解BIO,NIO,AIO之前先了解一下IO的几个概念: 1.同步 用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪, 例如自己亲自出马持银行卡到银行取钱 2.异步 用户触发IO操作以后, ...

  7. C++类静态变量的一种使用特例

    不同进程里的数据默认情况下是互不影响的. 静态变量是属于类本身的,它的所有实例可以共享这个静态变量,但是有个先天条件就是在同一个进程的情况下!!

  8. Qt-MVC图形视图框架分解

    前面在<Qt-MVC图形视图框架出识>中我们了解了Qt图形视图框架中三个最基本的类,弄清他们的关系,本片小文,我们将对QGraphicsView,QGraphiceScene,QGraph ...

  9. D3.js(v3)+react 制作 一个带坐标轴与比例尺的折线图

    本章使用路径生成器来绘制一个折线图.以中国和日本的GDP数据为例:   //数据 var dataList = [ { coountry : "china", gdp : [ [2 ...

  10. IntelliJ IDEA 激活

    方法1 进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.php   或者   http://idea.la ...