设计模式之建造者模式原理及实例(简单讲解)

建造者模式

建造者模式可以将部件本身和它们的组装过程分开,关注如何一步一步地创建一个包含组成部分的复杂对象,用户指需要指定复杂对象的类型即可得到该对象,而无须知道其内部的具体构造细节。

建造者模式是一种对象创建型模式,它将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分和分配方案,只需要知道所需建造者的类型即可。建造者模式关注如何一步一步地创建一个复杂对象,不同的建造者定义了不同的创建对象过程。

建造者模式的结构:

1.Builder(抽象建造者):

它为创建一个产品对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类是getResult()方法,它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

 

2.ConcreteBuilder(具体建造者):

它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确所创建的复杂对象,还可以提供一个方法返回建造好的复杂产品对象(该方法也可以由抽象建造者实现)。

 

3.Product(产品):

它是被建造的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并得以它的装配过程。

 

4.Director(指挥者):

指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造,客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制实现),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。

建造者模式的简单实现:

在建造者模式的定义中提到的复杂对象,那么什么是复杂对象?简单来说,复杂对象指那些包含多个成员变量的对象,这些成员对象变量也称为部件或者零件,如一辆汽车包括方向盘、发动机、轮胎等部件,点击邮件包括发件人、收件人、主题、内容、附件等部件。一个典型的复杂对象类的代码示例如下:

public class Product{
   private String partA;   //定义部件,部件可以是任意类型,包括值类型和引用类型
   private String partB;
   private String partC;
   //part的Getter和Setter方法省略
}

在抽象建造者中定义了产品的创建方法和返回方法,其典型代码如下:

public abstract class Builder{
   //创建产品对象
   protected Product product = new Product();
   public abstract void buildPartA();
   public abstract void buildPartB();
   public abstract void buildPartC();
   //返回产品对象
   public Product getResult(){
   return product;
}
}

在抽象类Builder中声明了一系列抽象的buildPartX()方法,用于创建复杂产品的各个部件,具体建造过程在ConcreteBuilder中实现,此外还提供了工厂方法getResult(),用于返回一个已创建好的完整产品对象。

在ConcreteBuilder中实现了这些buildPartX()方法,通过通过调用Product的setPartX()方法可以给产品对象的成员变量设值,不同的具体建造者在实现buildPartX()方法时有所区别,例如setPartX()方法的参数可能不一样,在有些具体建造者类中某些setPartX()方法无须实现(提供一个空实现)。而这些对于客户端来说都无须关心,客户端只需要知道具体建造者类型即可。典型的具体建造者类型代码如下:

public class ConcreteBuilder1 extends Builder{
   public void buildPartA(){
  product.setPartA(“A1”);
}
public void buildPartB(){
  product.setPartB(“B1”);
}
public void buildPartC(){
  product.setPartC(“C1”);
}
}

此外,在建造者模式中引入了一个指挥者类Director,该类主要有两个作用:一方面它隔离了客户端与创建过程;另一方面它控制产品对象的创建过程,包括某个buildPartX()方法是否被调用以及多个buildPartX()方法调用的先后次序等。指挥者类针对次抽象建造者编程,客户端只需要知道具体建造者的类型便可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。在实际生活中也存在类似指挥者一样的角色,如一个客户去购买电脑,电脑销售人员相当于指挥者,只要客户确定电脑的类型电脑销售人员可以通知电脑组装人员给客户组装一台电脑,指挥者类的示例代码如下:

public class Director{
   private Builder builder;
   public Director(Builder builder){//创建的时候就通过构造函数注入builder对象
   this.builder= builder;
}
public void setBuilder(Builder builder){//更改注入对象时才调用 
   this.builder = builder;
}
//产品构建与组装方法
public Product construct(){
   builder.buildPartA();
   builder.buildPartB();
   builder.buildPartC();
   return builder.getResult();
}
}

在指挥者类中可以注入一个抽象建造者类型的对象,它提供了一个建筑方法construct(),在该方法中调用了builder对象的构造部件的方法,最后返回一个产品对象。

对于客户端而言,只需要关心具体建造者的类型,无须关心产品对象的具体组装过程。通常,客户端代码片段如下:

...
Builder builder = new ConcreteBuilder1();  //创建具体建造者
Director director = new Director(builder);  //注入Builder对象
Product product = director.construct();    //组装产品
...

建造者模式和抽象工厂模式都是较为复杂的创建型模式,建造者模式返回一个完整的复杂产品,抽象工厂模式返回一系列相关产品;在抽象工厂模式中,客户端通过选择具体工厂来生成所需对象,而在建造者模式中,客户端通过指定具体建造者类型来指导Director类如何去生成对象,侧重于一步步构造一个复杂对象,然后将结果返回。如果将抽象工厂模式看成一个汽车配件生产厂,生成不同类型的汽车配件,那么建造者模式就是一个汽车组装厂,通过对配件进行组装返回一辆完整的汽车。

 

本文借鉴了刘伟老师《Java设计模式》一书以及老师的相关博客

https://blog.csdn.net/lovelion/article/details/17517213

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值