建造者模式 - 图1


建造者模式属于设计模式中的构造性模式,也就是说该模式基本上是用在构建对象的时候。它的宗旨就是将一个复杂的事物,进行一步一步的构建,需要什么就拼接成什么。

源代码地址

源码连接

UML

类图如下:
建造者模式 - 图2

Derictor: 指挥人,哔哩吧啦说你这玩意儿要怎么建
builder:抽象建造者,怎么建的一系列方法
concreteBuilder:具体的劳动力,实现建造的方法
product:具体的产品类

源码分析
给大家讲一个生动形象的例子,小刚喜欢大保健,没事就去洗洗脚按按摩。从这句话里面,我们就可以分析出一个模式。
大保健:具体的产品
小刚:享受服务的指挥人,要什么服务都由他决定
老板:大保健服务的建造者

传统模式下,小刚要一个大保健服务是不是说:老板,做个大保健(new dabaojian())服务就出来了。但是存在一个问题,这样叫出来的是个大保健,但是
具体哪一些服务没有指定,老板肯定问你:都想做什么服务;那服务种类很多,不可能每次都是

  1. new Dabaojian("洗脚");
  2. new Dabaojian("洗脚","按摩");
  3. new Dabaojian("洗脚","按摩","papapa");

服务千姿百态这样就会存在弊端。老板也想到这个问题了
所以老板就会拼接各种服务给客人做成一个大保健
具体见代码分析

  1. public class Bighealthcare {
  2. private String xijiao;
  3. private String anmo;
  4. private String papapa;
  5. /**
  6. * 传统享受大保健服务就洗洗脚
  7. * @param xijiao
  8. */
  9. public Bighealthcare(String xijiao){
  10. this.xijiao = xijiao;
  11. }
  12. /**
  13. * 舒服一点就加个按摩
  14. * @param xijiao
  15. */
  16. public Bighealthcare(String xijiao,String anmo){
  17. this.xijiao = xijiao;
  18. this.anmo = anmo;
  19. }
  20. /**
  21. * 想更舒服就搞下特殊服务
  22. * @param xijiao
  23. * @param anmo
  24. * @param papapa
  25. */
  26. public Bighealthcare(String xijiao,String anmo,String papapa){
  27. this.xijiao = xijiao;
  28. this.anmo = anmo;
  29. this.papapa = papapa;
  30. }
  31. /**
  32. * 建造者模式的大保健服务
  33. */
  34. public Bighealthcare(Builder builder){
  35. this.xijiao = builder.xijiao;
  36. this.anmo = builder.anmo;
  37. this.papapa = builder.papapa;
  38. }
  39. protected static class Builder{
  40. protected String xijiao;
  41. protected String anmo;
  42. protected String papapa;
  43. protected Builder xijiao(String xijiao){
  44. this.xijiao = xijiao;
  45. return this;
  46. }
  47. protected Builder anmo(String anmo){
  48. this.anmo = anmo;
  49. return this;
  50. }
  51. protected Builder papapa(String papapa){
  52. this.papapa = papapa;
  53. return this;
  54. }
  55. protected Bighealthcare build(){
  56. return new Bighealthcare(this);
  57. }
  58. }
  59. public void service(){
  60. System.out.print(this.toString());
  61. }

小刚要做大保健了

  1. public class Test {
  2. public static void main(String args[]){
  3. //传统模式下的大保健服务
  4. Bighealthcare tradition = new Bighealthcare("洗个脚","按个摩","ppp");
  5. tradition.service();
  6. //建造器模式下的大保健服务,先构造一个大保健服务,具体要哪些项目可以一个个拼装,扩展方便
  7. //运用《effective java》中说的,当构造方法过多时就应该要考虑使用构造器,其实就是建造者模式
  8. //简单大保健
  9. Bighealthcare simpleBighealthcare = new Bighealthcare.Builder().xijiao("洗个脚").build();
  10. simpleBighealthcare.service();
  11. //一般大保健
  12. Bighealthcare generalBighealthcare = new Bighealthcare.Builder().xijiao("洗个脚").anmo("按个摩").build();
  13. generalBighealthcare.service();
  14. //高级大保健
  15. Bighealthcare specialBighealthcare = new Bighealthcare.Builder().xijiao("洗个脚").anmo("按个摩").papapa("ppp").build();
  16. specialBighealthcare.service();
  17. }
  18. }