设计模式之建造者模式

一.什么是建造者模式

将一个复杂的对象的创建与它的表示分离,使得同样的创建过程有不同的表示。

二.建造者模式怎么写

一般的建造者模式,我们通过造房子的UML类图来理解一下

在这里插入图片描述

这里有四个角色,设计师,抽象建造者,具体建造者,还有所需要建造的对象。
下面看看具体的代码
设计师:


/** 
 * 设计师 和建造者是聚合关系(Aggregation)表示has-a的关系,是一种不稳定的包含关系 想象一下员工和老板的关系
 * @author Seven
 *
 */
public class Designer { 
	public House constructHouse(Builder builder) {

		builder.builderWindow();
		builder.builderFloor();
		return builder.genHouse();
	}
}

抽象构造者

/**
 * 抽象建造者 工人
 * 
 * @author Seven
 *
 */
public abstract class Builder {

	public abstract void builderWindow();

	public abstract void builderFloor();

	public abstract House genHouse();
}

具体构造者

public class WorkerBuilder extends Builder {

	private House house = new House();

	@Override
	public void builderWindow() {

		house.setWindow("欧式窗户");

	}

	@Override
	public void builderFloor() {

		house.setFloor("法式地板");
	}

	@Override
	public House genHouse() {

		return house;
	}

}

房子:

/**
 * 需要造的房子
 * 
 * @author Seven
 *
 */
public class House {

	private String window;
	private String floor;

	public String getWindow() {
		return window;
	}

	public void setWindow(String window) {
		this.window = window;
	}

	public String getFloor() {
		return floor;
	}

	public void setFloor(String floor) {
		this.floor = floor;
	}

	@Override
	public String toString() {
		return "House [window=" + window + ", floor=" + floor + "]";
	}
}

我们在来看看客户端的调用

public class Client {

	public static void main(String[] args) {
		
		Designer designer=new Designer();  //需要设计师
		Builder workerBuilder=new WorkerBuilder(); //需要工人
		House house=designer.constructHouse(workerBuilder); //建造房子的过程客户端无需知道,只要丢给设计者工人
		System.out.println(house.toString()); 
		
	}
}

我们来看看打印
House [window=欧式窗户, floor=法式地板]
这样就完成了房子的构建,我们并没有直接去new 一个house,而是由设计师去创建的这一切,不需要知道构造的过程。这就是标准的建造者模式。下面来开看建造者模式的变异,我们在上面的设计中,我们发现,通过House对象还是可以通过set方法区修改room的属性的,于是我们移除room的set方法,在WorkBuilder中增加一个内部类House Params,并且包含House 的全部属性,然后在Room类中提供一个包含HouseParams对象的引用,并将里面的参数设置给当前的house对象,我们在WorkBuilder中提供设置HouseParams参数的方法,结果代码就变成了这样:
房子:


public class House {
	

	private String window;
	private String floor;

	@Override
	public String toString() {
		return "House [window=" + window + ", floor=" + floor + "]";
	}
	
	
	public House apply(WorkerBuilder.HouseParams houseParams) {
		
		this.window=houseParams.window;
		this.floor=houseParams.floor;
		return this;
	}

}

构造者

public class WorkerBuilder {

	private House house=new House();
	private HouseParams houseParams=new HouseParams();
	public WorkerBuilder builderWindow(String window) {

		houseParams.window=window;
		
		return this;
	}

	public WorkerBuilder builderFloor(String floor) {

		houseParams.floor=floor;
		
		return this;
	}

	public House genHouse() {
		
		return house.apply(houseParams);
	}

	public class HouseParams{
		public String window;
		public String floor;
	}
}

客户端代码:

public class Client {

	public static void main(String[] args) {
		WorkerBuilder workerBuilder=new WorkerBuilder().builderFloor("地板").builderWindow("窗户"); //链式调用
		House house=workerBuilder.genHouse();
		System.out.println(house.toString());;
		
	}
}

打印结果
House [window=欧式窗户, floor=法式地板]
这样也是建造者模式。看起来像不像我们创建Dialog的调用过程。其实翻看源码,设计思想很相似的,这里就不做详细介绍了。

三.总结

本文介绍了什么是建造者模式以建造者模式的常见写法,以及建造者模式的变形写法,记住,建造者模式是用来处理复杂对象的构建的,如果本文对你有用,可以点个赞,如果有不正之处,欢迎留下你的评论,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值