建造者模式
一、定义
Builder模式也叫做建造者模式或是生成器模式,Builder模式是一种对象创建型模式之一,用来隐藏符合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象
二、代码实例
2.1 House
public class House {
//地板
private String floor;
//墙
private String wall;
//屋顶
private String roof;
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 getRoof() {
return roof;
}
public void setRoof(String roof) {
this.roof = roof;
}
}
2.2 HouseBuilder
public interface HouseBuilder {
//修地板
public void makeFloor();
//修墙壁
public void makeWall();
//修屋顶
public void makeRoof();
//返回房子
public House returnHouse();
}
2.3 PingFangBuilder(创建平房的工程队)
public class PingFangBuilder implements HouseBuilder {
House house = new House();
@Override
public void makeFloor() {
house.setFloor("平房的地板");
}
@Override
public void makeWall() {
house.setWall("平房的墙");
}
@Override
public void makeRoof() {
house.setRoof("平房的屋顶");
}
@Override
public House returnHouse() {
return house;
}
}
2.4 GongyuBuilder(创建公寓的工程队)
public class GongyuBuilder implements HouseBuilder{
House house = new House();
@Override
public void makeFloor() {
house.setFloor("公寓的地板");
}
@Override
public void makeWall() {
house.setWall("公寓的墙壁");
}
@Override
public void makeRoof() {
house.setRoof("公寓的屋顶");
}
@Override
public House returnHouse() {
return house;
}
}
2.5 HouseDicretor(设计者,接受工程队)
public class HouseDicretor {
private HouseBuilder houseBuilder;
public HouseDicretor(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}
public void makeHouse(){
houseBuilder.makeWall();
houseBuilder.makeRoof();
houseBuilder.makeFloor();
}
}
/*
更加规范
public class HouseDicretor {
public HouseDicretor(HouseBuilder houseBuilder){
houseBuilder.makeWall();
houseBuilder.makeRoof();
houseBuilder.makeFloor();
}
}
*/
2.6 MainClass
public class MainClass {
public static void main(String[] args){
//客户端直接造房子
House house = new House();
house.setFloor("地板");
house.setWall("墙壁");
house.setRoof("屋顶");
//由工程队来修
HouseBuilder builder = new PingFangBuilder();
//客服端需要调用工程队来修
builder.makeFloor();
builder.makeRoof();
builder.makeWall();
//创造完完后返回
House house1 = builder.returnHouse();
System.out.println(house1.getFloor());
System.out.println(house1.getRoof());
System.out.println(house1.getWall());
//改进版本,交给设计者设计house
//创建平房
HouseBuilder builder1 = new PingFangBuilder();
//设计者管理工程队
HouseDicretor houseDicretor = new HouseDicretor(builder1);
//make创建房子,设计者使用工程队开始创造房子,客户端不需自己调用
houseDicretor.makeHouse();
//创造完毕
House house2 = builder1.returnHouse();
System.out.println(house2.getFloor());
System.out.println(house2.getRoof());
System.out.println(house2.getWall());
//创建公寓,需要修改工程队
HouseBuilder builder2 = new GongyuBuilder();
houseDicretor = new HouseDicretor(builder2);
//make创建房子,工程队开始创造房子
houseDicretor.makeHouse();
//创造完毕
House house3 = builder2.returnHouse();
System.out.println(house3.getFloor());
System.out.println(house3.getRoof());
System.out.println(house3.getWall());
}
}
三、建造者模式应用场景
- 对象的创建:Builder模式是为对象的创建而设计的模式
- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象,例如代码中String的floor、wall、roof
- 关注对象创建的各部分的创建过程:不同的工厂(这里指的是Builder生成器)队产品属性有不同的创建发方法,例如代码中的GongyuBuilder、PingfangBuilder