热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

23种设计模式之【建造者模式】

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。讲解:一个对象(产品),可能有几部分组成。比如一辆汽车,主要由车身、发动机、轮胎、传动系统等组成。这些部件或系统就是对象

定义:

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

讲解:

一个对象(产品),可能有几部分组成。比如一辆汽车,主要由车身、发动机、轮胎、传动系统等组成。这些部件或系统就是对象的表示。而建造者模式将汽车这个复杂对象的构建过程与它的表示分离。也就是说客户只需要告诉建造者模式我想要什么样的汽车(小轿车或大卡车)就可以了。至于汽车是如何生产出来了,客户并不关心。同样的构建过程,构建出的汽车却不相同(小轿车或大卡车)。

类图:


角色:

产品类(Product):具体的产品,一般情况下是一个创建过程比较复杂的产品。
抽象建造者(Builder):抽象类,定义用来创建产品的抽象方法。
建造者(ConcreteBuilder):实现类,实现抽象建造者类,并实现其抽象方法。
导演类(Director):负责调用具体的建造者类,来完成产品的创建工作。

代码:

//产品类Product
class Car {
private String body;//车身
private String engine;//发动机
private String tire;//轮胎
private String driveSys;//传动系统

//省略get set方法
}
//抽象建造者Builder
abstract class Builder {
protected Car = new Car();
public abstract void buildBody(String body);//建造车身
public abstract void buildEngine(String engine);//建造发动机
public abstract void buildTire(String tire);//建造轮胎
public abstract void builcDriveSys(String driveSys);//建造传动系统
//获得汽车
public Car getCar(){
return car;
}
}
//小轿车建造者ConcreteBuilder
class CarBuilder extends Builder {
public void buildBody() {
car.setBody("小轿车车身");
}

public void buildEngine() {
car.setEngine("小轿车发动机");
}

public void buildTire() {
car.setTire("小轿车轮胎");
}

public void builcDriveSys() {
car.setDriveSys("小轿车传动系统");
}
}
//大卡车建造者ConcreteBuilder
class TruckBuilder extends Builder {
public void buildBody() {
car.setBody("大卡车车身");
}

public void buildEngine() {
car.setEngine("大卡车发动机");
}

public void buildTire() {
car.setTire("大卡车轮胎");
}

public void builcDriveSys() {
car.setDriveSys("大卡车传动系统");
}
}
//导演类
public class Director {
private Builder builder;

public void setBuilder(Builder builder) {
this.builder = builder;
}

public Car construct() {
builder.buildBody();
builder.buildEngine();
builder.buildTire();
builder.builcDriveSys();
return builder.getCar();
}
}
//客户端
public class Client {
public static void main(String[] args) {
Director director = new Director();//导演

Builder carBuilder = CarBuilder();
director.setBuilder(carBuilder);
Car car = director.construct();//小轿车

Builder truckBuilder = TruckBuilder();
director.setBuilder(truckBuilder);
Car truck = director.construct();//大卡车
}
}

好处:

  • 符合依赖倒转原则,抽象不应该依赖细节,细节应该依赖于抽象。产品的创建依赖于抽象建造者类,而不依赖于具体的建造者类,产品的创建细节在建造者类中实现。
  • 由于具体的建造者类之间相互独立,这样就可以定制化的实现不同的产品,而不影响其他已实现的功能。
  • 易于扩展,如果现有的建造者无法满足需求,只需要增加一个新的建造者实现类即可,而不会影响其他已实现的功能。

使用场景:

  • 稳定的创建过程,产品对象的创建过程稳定,也就是说抽象建造者类中的抽象方法稳定,不应该出现大的变动。
  • 产品对象的创建过程极其复杂,如果产品对象的创建过于简单,则不适合使用建造者模式。

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
快乐俱乐部老巢_260
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有