Java与模式之建造者模式详解

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

产品的内部表象

一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生成的产品对象有哪些零件,每个产品的对应零件彼此有何不同,是怎么样建造出来的,以及怎么样组成产品。

对象性质的建造

       有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有收件人地址、发件人地址、主题、内容等部分,而最起码的收件人地址得到赋值前,这个邮件是不能发出的。

       这个时候,此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程就是建造零件的过程。由于建造零件的过程很复杂,因此,这些零件的建造过程往往被“外部化”到另一个成为建造者的对象里,建造者对象返还给客户端的是一个全部零件都建造完毕的产品对象。

建造模式利用一个导演者对象和具体建造者对象一个一个的建造出出所有的零件,从而建造出完整的产品对象。建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割出来,达到责任划分和封装的目的。

 

建造者模式的结构

 

 

 

Ø  建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少零件,就有多少响应的建造方法。

Ø  具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:

•      实现Builder角色提供的接口,一步一步完成创建产品实例的过程。

•      在建造过程完成后,提供产品的实例。

Ø  指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

Ø  产品(Product)角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关的。

指导者角色是与客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。

一般说来,每有一个产品类,就有一个对应的具体建造者类。这些产品应当有一样数目的零件,而每有一个零件就应该在相应的建造者角色里有一个建造方法

 

建造模式的实现

       在这个诸神造人的系统中,女娲本人扮演建造者的角色,她控制着造人的诸神:黄帝、上骈和桑林。与女娲传土造人和举绳造人的神话不同,众神造人的神话是说人是一部分一部分的造出来的。黄帝创造了人的灵魂,上骈造出人的感官,桑林造出人的手臂。

 

 

抽象建造者角色:

 

public abstract class Builder {
	public abstract void buildPartOne();
	public abstract void buildPartTwo();	
	public abstract void buildPartThree();
	
	
	public abstract Product retrieveResult();
}

 

 

具体建造者角色:

 

public class ConcreteBuilder extends Builder {
	private Product product = new Product();

	@Override
	public void buildPartOne() {
		product.setPartOne("灵魂");	
		System.out.println("灵魂造好");
	}

	@Override
	public void buildPartTwo() {
		product.setPartTwo("感官");
		System.out.println("感官造好");
	}

	@Override
	public void buildPartThree() {
		product.setPartThree("耳目");
		System.out.println("耳目造好");
	}

	@Override
	public Product retrieveResult() {
		return product;
	}

	

}


导演角色

 

 

package builder;

public class Director {
	private Builder builder;
	
	public Director(Builder builder){
		this.builder = builder;
	}
	
	public  void construct() {
		builder.buildPartOne();
		builder.buildPartTwo();
		builder.buildPartThree();							
	}	
}


产品角色

 

 

public class Product {
	private String partOne; 
	private String partTwo; 
	private String partThree;
	
	@Override
	public String toString() {
		return "product:"+partOne+partTwo+partThree;
	}
	public String getPartOne() {
		return partOne;
	}
	public void setPartOne(String partOne) {
		this.partOne = partOne;
	}
	public String getPartTwo() {
		return partTwo;
	}
	public void setPartTwo(String partTwo) {
		this.partTwo = partTwo;
	}
	public String getPartThree() {
		return partThree;
	}
	public void setPartThree(String partThree) {
		this.partThree = partThree;
	}
}

 

客户端

 

 


public class Client {
	public static void main(String[] args) {
		Builder builder = new ConcreteBuilder();
		Director diretor = new Director(builder);				
		diretor.construct();		
		System.out.println(builder.retrieveResult());
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值