学习建造者模式
1 ,什么是建造者对象
1、隐藏了对象的创建过程,将对象的创建封装,让调用者更简单的创建,通过子类继承或者重载的方式,动态的创建对象。比如盖平房,需要盖楼顶,刷墙,铺地板,此时如果是调用者来实现,调用者需要自己来盖楼顶,刷墙,铺地板,增加了盖房子的难度,我们可以封装一个平房建造者实现建造者对象来处理这些难的事情,如果此时想盖楼房,再创建楼房建造者 实现 建造者对象即可,具体可看以下代码。
2、创建房子对象
public class House {
//地板
private String floor;
//墙壁
private String wall;
//楼顶
private String top;
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 getTop() {
return top;
}
public void setTop(String top) {
this.top = top;
}
}
3、普通方法盖房子的坏处,调用者自己盖房子,如果字段多了的情况选,稍有不慎,就少初始化一个字段
public static void main(String[] args) {
//调用者自己盖房子的方式,如果字段多了的情况选,稍有不慎,就少加一个
House house = new House();
house.setTop("盖楼顶");
house.setWall("刷墙壁");
house.setFloor("铺地板");
System.out.println(house.getTop());
System.out.println(house.getWall());
System.out.println(house.getFloor());
}
4、通过建造者方式来盖房子,首先创建建造者接口,接口中主要定义了盖房子的操作,建造完后,就可以获取到楼房的对象
public interface HouseBuilder {
//建造楼顶
void makeTop();
//建造墙壁
void makeWall();
//建造地板
void makeFloor();
//建造好后,获取楼房对象
House getHouse();
}
5、实现建造者类,比如想盖平房,这时使用平房来实现建造者接口,用该类来做实际的操作,当然有楼房或者更多,也可以实现接口
public class PingFangHouseBuilder implements HouseBuilder{
House house = new House();
@Override
public void makeTop() {
house.setTop("平房-楼顶");
}
@Override
public void makeWall() {
house.setWall("平房-墙壁");
}
@Override
public void makeFloor() {
house.setFloor("平房-地板");
}
@Override
public House getHouse() {
return house;
}
}
6、有了房子的建造者,那我们就用建造者来盖房子,发现这时创建房子只需要调用建造者方法来创建了,但是此时还有问题,调用者调用方法还是很多,比如房子应该先改地基,但是调用者却先盖了楼顶,这样肯定会出问题,
那么房子被调用者来控制顺序肯定是不合适的,那么引入一个新的设计模式,那就是设计者模式,调用这些方法的类
public static void main(String[] args) {
//这里的PingFangHouseBuilder是指平房,如果有更多,再去创建类来实现HouseBuilder接口
HouseBuilder houseBuilder = new PingFangHouseBuilder();
houseBuilder.makeTop();
houseBuilder.makeWall();
houseBuilder.makeFloor();
House house = houseBuilder.getHouse();
System.out.println(house.getTop());
System.out.println(house.getWall());
System.out.println(house.getFloor());
}
7、创建设计者类
//房屋设计师
public class HouseDirector {
private HouseBuilder houseBuilder;
//构造方法加入建造者,当然也可以其他方式加入
public HouseDirector(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}
public House make(){
houseBuilder.makeTop();
houseBuilder.makeWall();
houseBuilder.makeFloor();
House house = houseBuilder.getHouse();
return house;
}
}
8、直接调用设计师来执行,不再去调用者自己调用方法了
public static void main(String[] args) {
//这里的PingFangHouseBuilder是指平房,如果有更多,再去创建类来实现HouseBuilder接口
HouseBuilder pingFangHouseBuilder = new PingFangHouseBuilder();
HouseDirector houseDirector = new HouseDirector(pingFangHouseBuilder);
House house = houseDirector.make();
System.out.println(house.getTop());
System.out.println(house.getWall());
System.out.println(house.getFloor());
}