设计模式之构造者模式

构造者模式是创建型模式之一,当构造的产品比较复杂,需要分为多个步骤或者流程完成产品的构建,可以选用构造模式。

构造者模式将具体的构造流程或者顺序隐藏,用户只需要调用对应的构造方法而不需要关心具体的构造细节问题。

构造者模式分为抽象构造者,具体构造者,构造导演类(申明产品构造的具体流程),产品类

代码如下:

抽象构造者:

package com.dean.dp.builder.dir;

/**
 * 抽象构造者,定义构造对象的系列规范步骤
 * @author bobei01
 *
 */
public interface IBuilder {
	
	/**
	 * 构造墙
	 */
	public void builderWall();
	
	/**
	 * 构造地板
	 */
	public void builderFloor();
	
	/**
	 * 获取最终产品
	 * @return
	 */
	public House getHouse();

}

具体构造者:

package com.dean.dp.builder.dir;

/**
 * 具体构造者
 * @author bobei01
 *
 */
public class BuilderImpl implements IBuilder{

	private House house;
	
	public BuilderImpl() {
		super();
		this.house = new House();
	}

	@Override
	public void builderWall() {
		house.setWall("太墙了");
	}

	@Override
	public void builderFloor() {
		house.setFloor("超级无敌地板");
	}

	@Override
	public House getHouse() {
		return house;
	}
}

构造导演类:

package com.dean.dp.builder.dir;

/**
 * 建造者模式的导演类,负责调用具体的建造者
 * 引入具体的构造者,定义产品构造的流程顺序
 * 将具体的构造过程隐藏,用户只需要使用不需要关系其内部构建细节
 * @author bobei01
 *
 */
public class Director {
	private IBuilder builder;
	
	public Director(IBuilder builder) {
		super();
		this.builder = builder;
	}

	/**
	 * 指导如何构建房屋,在这个方法中还可用加入其他逻辑,即在构造是验证等其他操作
	 */
	public void builderHouse(){
		builder.builderWall();
		builder.builderFloor();
	}

}

产品类:

package com.dean.dp.builder.dir;

/**
 * 具体要构造的产品
 * @author bobei01
 *
 */
public class House {
	
	//房屋的墙
	private String wall;
	
	//房屋的地板
	private String floor;

	public String getWall() {
		return wall;
	}

	public void setWall(String wall) {
		this.wall = wall;
	}

	public String getFloor() {
		return floor;
	}

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

}

测试用例:

package com.dean.dp.builder.dir;

public class Main {

	public static void main(String[] args) {
		IBuilder builder = new BuilderImpl();
		Director director = new Director(builder);
		//直接构造对象,不需要关心具体的细节
		director.builderHouse();
		House house = builder.getHouse();
		System.out.println(house.getFloor());
	}
}

构造者模式另一种实现方式:上面方法中需要定义构造者接口,然后定义具体的构造者,通过导演类负责串联达到构造复杂对象。

在实际环境中,为了简化对象的创建,可以直接定义具体的构造者,不需要构造接口,与导演类。上面的方式通过接口定义构造产品,扩展比较灵活方便。

如果需要加入新的产品构造,只需要实现构造者接口,以及定义对应的构造者导演类即可。根据使用环境具体选择用什么方式。。。

代码

具体构造者:

package com.dean.dp.builder.sim;

/**
 * 直接使用具体的构建类,不需要导演类
 * @author bobei01
 *
 */
public class PeopleBuilder {
	private People people;
	
	public PeopleBuilder() {
		super();
		people = new People();
	}

	/**
	 * 构建名称
	 * @param name
	 * @return
	 */
	public PeopleBuilder builderName(String name){
		people.setName(name);
		return this;
	}
	
	public PeopleBuilder builderNum(String num){
		people.setNum(num);
		return this;
	}
	
	public PeopleBuilder builderAge(int age){
		people.setAge(age);
		return this;
	}
	
	public People builder(){
		//返回构造的对象之前还可做一些其他操作,比如验证修饰等
		return people;
	}
}

构造的产品:

package com.dean.dp.builder.sim;

public class People {

	// 名字
	private String name;
	// 电话
	private String num;
	// 年龄
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getNum() {
		return num;
	}

	public void setNum(String num) {
		this.num = num;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

测试用例:

package com.dean.dp.builder.sim;

public class Main {

	public static void main(String[] args) {
		People people = new PeopleBuilder().builderAge(27).builderName("Dean Yang").builderNum("425343").builder();
		System.out.println(people.getName());// Dean Yang
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值