创建者模式用来创建一个较为复杂的对象,通过该模式隐藏了较为复杂的创建过程,用户只需要使用创建功能就能获取到构造出的复杂的对象。下面是我对该模式理解后画的一张图
下面通过代码和图进行说明:
1.首先我们要创建一个房子House,定义了一个类。
public class House {
private String floor;
private String wall;
private String housetop;
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getHousetop() {
return housetop;
}
public void setHousetop(String housetop) {
this.housetop = housetop;
}
}
2.我们要去建这个房子House,但是不知道建什么样的房子,所以定义一个建房子的接口HouseBuilder,只用来定义建房子的方法。
public interface HouseBuilder {
public void makeFloor();
public void makeWall();
public void makeHousetop();
public House getHouse();
}
3.既然要建房子,就要知道建什么样的房子,比如平房,公寓,那么就创建类实现建房子的接口,该具体的建什么样的对象的类就是建造者,创建出具体的对象是什么样的,并定义方法返回建出的对象。
平房:
public class PingFangBuilder implements HouseBuilder {
House house = new House();
public void makeFloor() {
house.setFloor("平房-->地板");
}
public void makeWall() {
house.setHousetop("平房-->房顶");
}
public void makeHousetop() {
house.setWall("平房-->墙");
}
public House getHouse() {
return house;
}
}
公寓:
public class GongYuBuilder implements HouseBuilder {
House house = new House();
public void makeFloor() {
house.setFloor("公寓-->地板");
}
public void makeWall() {
house.setHousetop("公寓-->房顶");
}
public void makeHousetop() {
house.setWall("公寓-->墙");
}
public House getHouse() {
return house;
}
}
4.虽然建造者实现了建造过程,但是用户使用的时候需要自己执行set方法进行建造,这样就会很麻烦,用户需要知道建造过程,所以我们还需要一个类,指挥该建造者进行建造。
public class HouseDicrector {
//传入的builder是具体的建造者
public HouseDicrector(HouseBuilder builder){
builder.makeFloor();
builder.makeHousetop();
builder.makeWall();
}
}
5.用户使用,使用时用户需要的是House的对象house,用户需要什么样的对象house则获取相应的建造者PingFangBuilder或GongYuBuilder。
将获取到的house对象传入指挥者,指挥者让建造者进行建造。
public class MainClass {
public static void main(String[] args) {
HouseBuilder houseBuilder = new GongYuBuilder();
HouseDicrector hd = new HouseDicrector(houseBuilder);
House house = houseBuilder.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getHousetop());
System.out.println(house.getWall());
}
}
执行结果如下:
注:代码来自网络教学视频,新手上路,理解不正确的地方敬请指出