Java设计模式--建造者模式(Builder)

概述


  • 建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如何一步一步创建一个的复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,增加新的建造者非常方便,无须修改已有代码,系统具有较好的扩展性。
  • 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 建造者模式是一种对象创建型模式。
  • 学习难度:★★★★☆
  • 使用频率:★★☆☆☆

优缺点


  • 优点
    • 将构造复杂对象的过程和组成对象的部件解耦
  • 缺点

类图


在这里插入图片描述

组成角色


  • 抽象建造者角色(Builder)
  • 具体建造者角色(ConcreteBuilder)
  • 产品角色(Product)
  • 指导者角色(Director)

Code Example


抽象建造者角色(Builder)
/**
 * 抽象建造者角色:这个角色用来规范产品对象的各个组成成分的建造,与业务无关。
 * 
 * @author yanbin
 * 
 */
public interface Builder {

   // 创建部件A 比如创建汽车车轮
   void buildPartA();

   // 创建部件B 比如创建汽车方向盘
   void buildPartB();

   // 创建部件C 比如创建汽车发动机
   void buildPartC();

   // 返回最后组装成品结果 (返回最后装配好的汽车)
   // 产品的组装过程不在这里进行,而是转移到下面的Director类中进行.
   // 从而实现了解耦过程和部件
   Product buildProduct();

}
具体建造者角色(ConcreteBuilder)
/**
 * 具体建造者角色:担任这个角色的是于应用程序紧密相关的类,它们在指导者的调用下 创建产品实例。
 * 这个角色在实现抽象建造者角色提供的方法的前提下,达到完成产品组装,提供成品的功能。
 * 
 * @author yanbin
 * 
 */
public class ConcreteBuilder implements Builder {

   private Product product = new Product();

   public void buildPartA() {
      product.setPartA("大轮胎");
   }

   public void buildPartB() {
      product.setPartB("大方向盘");
   }

   public void buildPartC() {
      product.setPartC("大发动机");
   }

   public Product buildProduct() {
      return product;
   }

}
产品角色(Product)
/**
 * 产品对象角色:建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。 包括产品本身和装配方法<br>
 * 
 * @author yanbin
 * 
 */
public class Product {

   private String partA;

   private String partB;

   private String partC;

   public String getPartA() {
      return partA;
   }

   public void setPartA(String partA) {
      this.partA = partA;
   }

   public String getPartB() {
      return partB;
   }

   public void setPartB(String partB) {
      this.partB = partB;
   }

   public String getPartC() {
      return partC;
   }

   public void setPartC(String partC) {
      this.partC = partC;
   }

}
指导者角色(Director)
/**
 * 指导者角色(也叫上下文):调用具体建造者角色以创建产品对象。指导者并没有产品类的具体知识, 真正拥有产品类的具体知识的是具体建造者对象。
 * 
 * @author yanbin
 * 
 */
public class Director {

   private Builder builder;

   public Director(Builder builder) {
      this.builder = builder;
   }

   // 将部件partA partB partC最后组成复杂对象
   // 这里是将车轮 方向盘和发动机组装成汽车的过程
   public void construct() {
      builder.buildPartA();
      builder.buildPartB();
      builder.buildPartC();
   }

}
客户端
/**
 * 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的表示。将构造复杂对象的过程和组成对象的部件解耦。
 * 运用场景:本来只由一个小对象组成的逻辑,后来更改后需要多个小对象组成。 且不能把内部暴露客户程序。兼得可用性和安全 <br/>
 * 和抽象工厂的区别:将构建复杂对象的过程和它的部件解耦.<br>
 * 注意:是解耦过程和部件。<br>
 * 建造者多出一个指导者的角色。创建模式着重于逐步将组件装配成一个成品并向外提供成品,而抽象工厂模式着重于得到产品族中相关的多个产品对象<br>
 * 
 * 组成:抽象建造者角色,具体建造者角色,指导者角色,产品角色
 * 
 * @author yanbin
 * 
 */
public class BuilderPattern {

   public static void main(String[] args) {
      // 多态创建建造者(部件)
      Builder builder = new ConcreteBuilder();
      // 根据建造着实例化指导者 (构建过程)
      Director director = new Director(builder);
      // 利用指导者来创建
      director.construct();
      // 表现
      Product product = builder.buildProduct();
      System.out.println(product);
      System.out.println(product.getPartA());
      System.out.println(product.getPartB());
      System.out.println(product.getPartC());
   }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值