构造者模式(builder)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造者模式(builder)相关的知识,希望对你有一定的参考价值。

参考技术A 在工作中我们经常遇到参数比较多的构造函数,构造函数的参数可能很快就会失控,而且可能很难理解每个参数。如果将来你想添加参数,或者改变参数,这个参数列表还可能更快增长,很容易出错。例如生成下面的“英雄”角色,选择职业、性别、头发颜色等,角色的生成就变成了一个一步一步的过程,当所有的选择都准备好了,这个过程就完成了。

我们可以利用java中的构造者设计模式进行重构,首先有我们想要的“英雄”。

然后是建造者:

然后调用方法:

类图:

构造者模式

构造者模式(又叫生成器模式 Builder Pattern)

将一个复杂对象(下面说的车,手机等)的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

 

 

首先看UML图

技术分享

 

 

可以看到他主要的3个部分,还是借鉴大家普遍采用的汽车制造来说明

首先是一个抽象类Builder,Builder中声明了一个具体产品各部件所需要的抽象方法以及一个返回最终产品的抽象方法。比如建造轮胎,建造引擎,建造外壳……以及一个返回最终产品车的方法

 

Java代码 
  1. public abstract class Builder {  
  2.     public abstract void buildEngine();  
  3.     public abstract void bulidTyre();  
  4.     public abstract void buildCar();  
  5.     public abstract void getCar();  
  6. }  

 其次,是下面的具体实现类ConcreeteBuilder,这也是构造者模式的最主要部分,他负责详细的去定义每个部件的具体制作,也就是不同的ConcreeteBuilder实现不同的建造轮胎,引擎,外壳的方法,比如我们具体类分别为BMW,Ford。。。

 

Java代码 
  1. public class BMW extends Builder{  
  2.     public void buildCar() {  
  3.         ...//造外壳细节  
  4.     }  
  5.     public void buildEngine() {  
  6.         ...//造引擎  
  7.           
  8.     }  
  9.     public void bulidTyre() {  
  10.         ...//造轮胎  
  11.     }  
  12.     public Car getCar() {  
  13.         return new Car();  
  14.     }  
  15. }  

 最后,是一个Director类,他类似于一个发令员,在汽车制造中,就是负责组装,将各个部件组合成最终产品,交还给客户,调用一个Builder类对象,并指导完成各步建造

 

Java代码 
  1. public class Director {  
  2.     public void product(Builder builder){  
  3.         builder.buildCar();  
  4.         builder.buildEngine();  
  5.         builder.bulidTyre();  
  6.     }  
  7. }  

 到此为止,生成器模式就完成了,来看看如何去制造一个具体的产品返回给客户

 

Java代码 
  1. public class Client {  
  2.     public static void main(String args[]){  
  3.         Builder builder=new BMW();//创建一个Builder对象  
  4.         Director director=new Director();//创建一个Director对象  
  5.         director.product(builder);//Director对象造车  
  6.         builder.getCar();//将制造的车返回  
  7.     }  
  8. }  

 

最终我们的构造者/生成器模式,带给我们了这样的结果

●生成器模式可以改变它所构建的产品的内部表示,另外还隐藏了产品如何装配的细节(Director)

●每个特定的生成器与其他生成器以及程序的其余部分无关。这增强了程序的模块性,并使增加额外模块变得相对简单(很明显,只要再实现一个新的ConcreeteBuilder即可)

●由于每个生成器都是根据数据逐步构建最终产品的,因此可以对生成器所构建的每个最终产品拥有更多的控制(在ConcreeteBuilder中)

 

 

总结下生成器模式与抽象工厂的区别,他们都返回由多个方法和对象组成的类

抽象工厂模式返回一系列相关的类

生成器模式根据所提供的数据将逐步构建一个复杂的对象

 

如果对比抽象工厂中举的手机例子,我的理解是,生成模式将为每个手机的建造提供一致的方法,比如建造外壳(Nokia),建造电池,建造芯片,安装系统。。。。。可以明显看出2个设计模式的区别

以上是关于构造者模式(builder)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之建造者(Builder)模式

一天一个设计模式——Builder建造者模式

java设计模式--Builder模式

GOF23设计模式之建造者模式(builder)

构建者模式-Builder

建造者模式(Builder Pattern)