首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式(十):建造者模式

设计模式(十):建造者模式

作者头像
xujjj
发布2019-07-30 19:58:55
4050
发布2019-07-30 19:58:55
举报
文章被收录于专栏:IT界的泥石流IT界的泥石流

什么是建造者模式

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

建造者模式的应用场景

在软件系统开发过程中,我们常常会需要一个创建过程复杂的对象,这个复杂的对象由多个子部件按照指定的步骤组合而成。由于需求的变化,这个复杂的对象各个部分经常面临着变化,但是将它们组合的步骤相对稳定。

如用户购买汽车,汽车由发动机、底盘、车身和电气设备等子部件组装而成,各个子部件有不同的种类,用户有定制化要求,由厂家进行定制化组装好直接交付用户,但组装步骤基本一致;如计算机主机由CPU,主板、内存、显卡等子部件组成,而子部件之间有不同的种类,但组装步骤基本一致;如Word文档由文字、图片等子部件组成,而子部分内容都不一致,但组装步骤基本一致。

以上这些产品都是由多个部件构成的,各个部件种类多样可供选择,但其创建步骤基本一致。这类产品使用工厂方法模式创建较为复杂,而建造者模式可以很好地适用这类产品的创建,它是将一个复杂的对象分解为多个简单的对象,按照一定的步骤构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

建造者模式的优点如下:

  • 各个建造者相互独立,有利于系统的扩展。
  • 使用者不必知道产品内部的细节,便于控制细节风险。

建造者模式的缺点如下:

  • 产品必须有共同点,这限制了其使用范围。
  • 如果产品的内部变化复杂,会增加很多的建造者类。

建造者模式与工厂方法模式

  • 意图不同

在工厂方法模式里,无须关心产品是如何创建出来的,在乎产品能否正常生产;但在建造者模式中,它关注一个产品是如何被生产出来的,在乎各个部件的种类、生产以及装配顺序。简单地说,工厂方法模式在乎结果,建造者模式在乎过程。

  • 产品的复杂度不同

联系实际生活,我们可以想到工厂往往是生产单一性质的产品来提高效率和利润。工厂方法模式正是如此,生产单一性质的产品。而建造者模式,适用于由多个子部件组合而成的复杂产品的生产,如同苹果手机在全球有多个代工厂,最终将多个代工厂生成的子部件产品组合成苹果手机。

建造者模式的结构与实现

1、结构

建造者模式的角色如下。

1.指挥者角色(Director):它调用具体建造者对象中的产品部件构造与装配方法完成复杂对象的创建。

2.抽象建造者角色(Builder):它定义了产品部件创建接口以及具体创建产品的方法。

3.具体建造者角色(ConcreteBuilder):实现 Builder 接口,实现产品各个部件的创建方法。

4.产品角色(Product):它是由多个部件组成的复杂对象,由具体建造者来创建其各个部件。

2、实现

我们以用户购买汽车,汽车生产为例,简单描述实现过程。根据建造者模型的架构,我们需要生产指挥者——经理、生产抽象建造者——工人、生产具体建造者——汽车工人、生产产品——汽车。代码如下:

//指挥者:经理
public class Manager {
  private Worker worker;
  
  public Manager(Worker worker) {
    this.worker = worker;
  }
  
  public Car createProduct() {
    worker.buildColor();
    worker.buildConfiguration();
    worker.buildTyre();
    return worker.createProduct();
  }
}
//抽象建造者:工人
public abstract class Worker {
  
  protected Car car = new Car();//产品对象
  
  public abstract void buildColor();//创建汽车颜色
  public abstract void buildConfiguration();//创建汽车配置
  public abstract void buildTyre();//创建汽车轮胎
  
  public Car createProduct() {
    return car;
  }
}
//具体建造者:汽车工人
public class ConcreteCarWorker extends Worker {

  @Override
  public void buildColor() {
    car.setColor("黑色");
  }

  @Override
  public void buildConfiguration() {
    car.setConfiguration("高级配置");
  }

  @Override
  public void buildTyre() {
    car.setTyre("贵一点的轮胎");
  }
}
//产品:车子
public class Car {
  private String color; //车身颜色
  private String configuration; //车配置
  private String tyre; //车轮胎
  
  public String getColor() {
    return color;
  }
  public void setColor(String color) {
    this.color = color;
  }
  public String getConfiguration() {
    return configuration;
  }
  public void setConfiguration(String configuration) {
    this.configuration = configuration;
  }
  public String getTyre() {
    return tyre;
  }
  public void setTyre(String tyre) {
    this.tyre = tyre;
  }
  @Override
  public String toString() {
    return "Car [color=" + color + ", configuration=" + configuration + ", tyre=" + tyre + "]";
  }
  
}
//测试类
public class Test {

  public static void main(String[] args) {
    Worker carWorker = new ConcreteCarWorker();
    Manager manager = new Manager(carWorker);
    Car car = manager.createProduct();
    System.out.println(car.toString());
  }
}
运行结果如下:
Car [color=黑色, configuration=高级配置, tyre=贵一点的轮胎

以上就是今天《建造者模式》的讲解,良好的代码风格需要长期不断的积累学习。各位读者大人若有问题,欢迎后台留言,我将第一时间回复!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT界的泥石流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档