组件很多,装配顺序不定

本质:

1,分离了对象子组件的单独构造(Builder负责)和装配(Director负责),从而可以构造出复杂的对象,这个模式适用于某个对象的构建过程复杂的情况下使用

2,实现了构建和装配的解耦

/**建造者用来得到各个组件
 * @author 小帆敲代码
 *
 */
public interface AirshipBuilder {
  public Engine getngine();//可用工厂或者单例模式得到对应的组件
  public EscapeTower getEscapeTower();
  public ObitalMoudle getObitalMoudle();
}

public class FAirshipBuilder implements AirshipBuilder{
 @Override
 public Engine getngine() {
  System.out.println("建造发动机");
  return new Engine("F牌发动机");
 }
 @Override
 public EscapeTower getEscapeTower() {
  System.out.println("建造逃生塔");
  return new EscapeTower("F牌");
 }
 @Override
 public ObitalMoudle getObitalMoudle() {
  System.out.println("建造轨道舱");
  return new ObitalMoudle("F牌轨道舱");
 }
}
/**
 * 装配组件
 * @author 小帆敲代码
 *
 */
public interface AirshipDirector {
 //装配
  public Airship directAirship();
}
public class FAirshipDirector implements AirshipDirector{
 private AirshipBuilder builder;
 public FAirshipDirector(AirshipBuilder builder) {
  this.builder = builder;
 }
 @Override
 public Airship directAirship() {
  Engine e=builder.getngine();
  EscapeTower et=builder.getEscapeTower();
  ObitalMoudle o=builder.getObitalMoudle();
  
  //装配
  Airship airship=new Airship();
  airship.setEngine(e);
  airship.setEscapeTower(et);
  airship.setObtalMoudle(o);
  return airship;
 }
}
public class Airship {
  private Engine engine;//发动机
  private ObitalMoudle obtalMoudle;//轨道舱
  private EscapeTower escapeTower;//逃生塔
  
  public void lauch() {
   System.out.println("发射!!!");
  }
  
  public Engine getEngine() {
   return engine;
  }
  public void setEngine(Engine engine) {
   this.engine = engine;
  }
  public ObitalMoudle getObtalMoudle() {
   return obtalMoudle;
  }
  public void setObtalMoudle(ObitalMoudle obtalMoudle) {
   this.obtalMoudle = obtalMoudle;
  }
  public EscapeTower getEscapeTower() {
   return escapeTower;
  }
  public void setEscapeTower(EscapeTower escapeTower) {
   this.escapeTower = escapeTower;
  }
  
  
}
class Engine{
 private String name;
 public Engine(String name) {
  this.name = name;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}
class ObitalMoudle{
 private String name;
 public ObitalMoudle(String name) {
  this.name = name;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}
class EscapeTower{
 private String name;
 public EscapeTower(String name) {
  this.name = name;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}
public class Client {
 public static void main(String[] args) {
   FAirshipDirector f=new FAirshipDirector(new FAirshipBuilder());
   Airship airship=f.directAirship();
   
   System.out.println(airship.getEngine().getName());
   
   airship.lauch();
 }
}

设计模式之GOF23建造者模式的更多相关文章

  1. java23种设计模式——五、建造者模式

    源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...

  2. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  3. 设计模式学习之建造者模式(Builder,创建型模式)(6)

    假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...

  4. PHP设计模式之:建造者模式

    建造者模式: 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式; 目的: 消除其他对象复杂的创建过程 结构图: 优点: 建造者模式可以很好的将一个对象的实现与相关的“业 ...

  5. java常用设计模式五:建造者模式

    1.定义 是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 产品类:一般是一个较为复杂的对象,也就是说创建对象的 ...

  6. Java设计模式学习记录-建造者模式

    前言 今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发企业内部系统的这种传统开发,感觉这 ...

  7. java设计模式-----6、建造者模式

    Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类 ...

  8. IOS设计模式浅析之建造者模式(Builder)

    定义 "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现". 最初的定义出现于<设计模式>(Addison-Wesley,1994). 看这个概 ...

  9. Java设计模式14:建造者模式

    什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家. 建造者模式是什么呢?用一句话概括就是建造者模式的目的是为了分离对象的属性与创建过程,是 ...

随机推荐

  1. notepad++批量每行加字符

    移动光标到头 选择正则 输入^ 下面输入需要加的文本. 点替换

  2. 嵌入css方式

    总体见思维导图 . 嵌入css方式 1 内联式 内联式css样式表就是把css代码直接写在现有的HTML标签中,如下面代码: <p style="color:red"> ...

  3. python-用户输入和while循环

    函数input() 比较大小要同类型: age=iput() 21 age=int(age) age>=10 true prompt = "If you tell us who you ...

  4. mysql 使用记录

    修改 mysql 数据库密码 mysqladmin -u username -h host_name password -P <port> "new_password" ...

  5. python 开发一款图片压缩工具(四):上传图床

    上一篇使用了 pngquant 图片压缩工具进行压缩,并通过 click 命令行工具构建了 picom 包.这篇的主要功能是实现图片上传. 图片上传功能的实现 通过 pngquant 压缩图片后,得到 ...

  6. HTTP 1.1, 返回值100.

    HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401.客户端如果接受到100,才开始把请求body发送到服务器. 这样 ...

  7. 日志分析工具ELK(三)

    目前官网更新特别快,不到半年时间就更新了好几个版本,目前最新的是5.1 以下安装配置使用4.5版本的 https://www.elastic.co/guide/en/kibana/4.5/index. ...

  8. vue2.x学习笔记(二十九)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12682822.html. 路由 官方路由 对于大多数的单页面应用,都推荐使用官方支持的vue-router库. 从 ...

  9. 【Leetcode】104. 二叉树的最大深度

    题目 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7 ...

  10. Netty(七):EventLoop学习前导——Reactor模式

    了解Netty的人多少都会知道Netty的高性能的一个原因就是它是基于事件驱动的,而这一事件的原型就是Reactor模式. 所以在学习EventLoop前,很有必要先搞懂Reactor模式. 本文目录 ...