构造者模式是创建型模式之一,当构造的产品比较复杂,需要分为多个步骤或者流程完成产品的构建,可以选用构造模式。
构造者模式将具体的构造流程或者顺序隐藏,用户只需要调用对应的构造方法而不需要关心具体的构造细节问题。
构造者模式分为抽象构造者,具体构造者,构造导演类(申明产品构造的具体流程),产品类
代码如下:
抽象构造者:
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
}
}