设计模式系列-建造者模式

开发 前端
建造者模式用于将复杂对象的创建和表示分离,有些对象由很多部分组成,每个部分又可以有多种不同选择,创建这种对象的时候往往需要考虑使用建造者模式。

  [[431024]]

建造者模式用于将复杂对象的创建和表示分离,有些对象由很多部分组成,每个部分又可以有多种不同选择,创建这种对象的时候往往需要考虑使用建造者模式。

举个例子

一辆汽车由发动机,方向盘,车灯,车灯,车身颜色等组成,每辆车的颜色,车轮大小,车灯样式可能会不一样,但是车的组成部分不会少。

建造模式有两种实现方式,第一种方式是有导演的方式,第二种是无导演方式。根据我的经验日常使用无导演的方式可能会更多一些。

有导演

所谓有导演就是通过一个导演类来指挥对象创建的过程,客户端使用导演类来获取对象,不用关心对象具体的创建过程。

先看一下UML图,对建造模式有个大概的了解。

看一下具体代码,我们以建造一辆汽车举例

  1. public class Car { 
  2.  
  3.     private String wheel; 
  4.     private String engine; 
  5.     private String seat; 
  6.     private String lamp; 
  7.     private String color; 
  8.  
  9.    //篇幅原因,此处省略get,set方法 
  10.  
  11.     @Override 
  12.     public String toString() { 
  13.         return "Car{" + 
  14.                 "wheel='" + wheel + '\'' + 
  15.                 ", engine='" + engine + '\'' + 
  16.                 ", seat='" + seat + '\'' + 
  17.                 ", lamp='" + lamp + '\'' + 
  18.                 ", color='" + color + '\'' + 
  19.                 '}'
  20.     } 

抽象Builder类,指定建造复杂对象步骤

  1. public abstract class Builder { 
  2.      
  3.     public abstract void buildWheel(); 
  4.  
  5.     public abstract void buildSeat(); 
  6.  
  7.     public abstract void buildLamp(); 
  8.  
  9.     public abstract void buildColor(); 
  10.  
  11.     public abstract void buildEngine(); 
  12.  
  13.     public abstract Car getCar(); 
  14.  

具体Builder类,实现复杂对象具体建造过程和内容

  1. public class ConcreteBuilder extends Builder { 
  2.  
  3.     private Car car; 
  4.  
  5.     public ConcreteBuilder() { 
  6.         car = new Car(); 
  7.     } 
  8.  
  9.     @Override 
  10.     public void buildWheel() { 
  11.         car.setWheel("wheel"); 
  12.     } 
  13.  
  14.     @Override 
  15.     public void buildSeat() { 
  16.         car.setSeat("seat"); 
  17.     } 
  18.  
  19.     @Override 
  20.     public void buildLamp() { 
  21.         car.setLamp("lamp"); 
  22.     } 
  23.  
  24.     @Override 
  25.     public void buildColor() { 
  26.         car.setColor("color"); 
  27.     } 
  28.  
  29.     @Override 
  30.     public void buildEngine() { 
  31.         car.setEngine("engine"); 
  32.     } 
  33.  
  34.     //返回构建好的汽车模型 
  35.     @Override 
  36.     public Car getCar() { 
  37.         return car; 
  38.     } 

Director类,决定了复杂对象的创建过程。

  1. public class CarDirector { 
  2.     public Car createCar(Builder builder){ 
  3.         builder.buildWheel(); 
  4.         builder.buildSeat(); 
  5.         builder.buildLamp(); 
  6.         builder.buildColor(); 
  7.         builder.buildEngine(); 
  8.         return builder.getCar(); 
  9.     } 

客户端这样使用

  1. public class BuilderClient { 
  2.     public static void main(String[] args){ 
  3.         CarDirector carDirector = new CarDirector(); 
  4.         //通过Director创建具体对象,不关心对象的创建过程 
  5.         Car car = carDirector.createCar(new ConcreteBuilder()); 
  6.         System.out.println(car.toString()); 
  7.     } 

无导演

无导演模式感觉日常开发中用的比较多,但凡见到形似这样的代码,大概率就是建造者模式了。

  1. Car car = concreteBuilderA.buildEngine("engine"
  2.                     .buildLamp("lamp"
  3.                     .buildSeat("seat"
  4.                     .buildColor("color"
  5.                     //.buildWheel("wheel"
  6.                     .build(); 

老规矩先来看一下UML图,来个整体的认识。

同样来看一下具体代码实现,还是以创建汽车为例,所以Car的代码不在重复给出。

Builder类

  1. public abstract class BuilderA { 
  2.     //返回builder自身 
  3.     abstract BuilderA buildWheel(String wheel); 
  4.     abstract BuilderA buildEngine(String engine); 
  5.     abstract BuilderA buildLamp(String lamp); 
  6.     abstract BuilderA buildSeat(String seat); 
  7.     abstract BuilderA buildColor(String color); 
  8.     abstract Car build(); 

具体Builder,负责对象的具体创建工作。

  1. public class ConcreteBuilderA extends BuilderA  { 
  2.  
  3.     private Car car; 
  4.  
  5.     public ConcreteBuilderA() { 
  6.         car = new Car(); 
  7.     } 
  8.  
  9.     @Override 
  10.     BuilderA buildWheel(String wheel) { 
  11.         car.setWheel(wheel); 
  12.         return this; 
  13.     } 
  14.  
  15.     @Override 
  16.     BuilderA buildEngine(String engine) { 
  17.         car.setEngine("engine"); 
  18.         return this; 
  19.     } 
  20.  
  21.     @Override 
  22.     BuilderA buildLamp(String lamp) { 
  23.         car.setLamp("lamp"); 
  24.         return this; 
  25.     } 
  26.  
  27.     @Override 
  28.     BuilderA buildSeat(String seat) { 
  29.         car.setSeat("seat"); 
  30.         return this; 
  31.     } 
  32.  
  33.     @Override 
  34.     BuilderA buildColor(String color) { 
  35.         car.setColor("color"); 
  36.         return this; 
  37.     } 
  38.  
  39.     @Override 
  40.     Car build() { 
  41.         return car; 
  42.     } 

客户端这样使用

  1. public class BuilderAClient { 
  2.     public static void main(String[] args){ 
  3.         ConcreteBuilderA concreteBuilderA = new ConcreteBuilderA(); 
  4.  
  5.         Car car = concreteBuilderA.buildEngine("engine"
  6.                     .buildLamp("lamp"
  7.                     .buildSeat("seat"
  8.                     .buildColor("color"
  9.                     //.buildWheel("wheel"
  10.                     .build(); 
  11.         System.out.println(car.toString()); 
  12.     } 

总结

建造者模式是创建型模式之一,所谓的没有Director的模式,只不过是把建造过程留给了客户端,让使用者自己决定怎样创建对象。无Director模式的实现关键是Builder类里面构建每个组件的方法都是返回Builder自己。

责任编辑:武晓燕 来源: 花括号MC
相关推荐

2020-10-20 13:33:00

建造者模式

2021-01-21 05:34:14

设计模式建造者

2021-04-14 09:02:22

模式 设计建造者

2020-11-05 09:38:07

中介者模式

2011-07-14 14:46:46

设计模式

2020-10-26 08:45:39

观察者模式

2024-02-19 08:38:34

建造者模式Android设计模式

2013-11-26 17:09:57

Android设计模式

2021-07-08 11:28:43

观察者模式设计

2022-01-29 22:12:35

前端模式观察者

2021-05-11 08:54:59

建造者模式设计

2021-06-10 19:09:05

模式代码建造者

2022-01-12 13:33:25

工厂模式设计

2020-11-03 13:05:18

命令模式

2020-10-23 09:40:26

设计模式

2020-11-04 08:54:54

状态模式

2021-07-28 10:02:54

建造者模式代码

2021-03-02 08:50:31

设计单例模式

2021-09-29 13:53:17

抽象工厂模式

2020-10-19 09:28:00

抽象工厂模式
点赞
收藏

51CTO技术栈公众号