案例
盖房项目需求:
- 需要建房子:这一过程为打桩、砌墙、封顶等
- 房子有很多种类:例如普通房、高楼、别墅等,虽然建房子的过程一样,但是要求不一定相同
- 请编写程序完成需求
传统方式解决盖房需求
public abstract class AbstractHouse {
/**
* 打地基
*/
public abstract void buildBasic();
/**
* 砌墙
*/
public abstract void buildWalls();
/**
* 封顶
*/
public abstract void roofed();
public void build(){
buildBasic();
buildWalls();
roofed();
}
}
public class CommonHouse extends AbstractHouse {
@Override
public void buildBasic() {
System.out.println("普通房子打地基");
}
@Override
public void buildWalls() {
System.out.println("普通房子砌墙");
}
@Override
public void roofed() {
System.out.println("普通房子封顶");
}
}
public class Client {
public static void main(String[] args) {
CommonHouse commonHouse = new CommonHouse();
commonHouse.build();
}
}
优缺点
- 优点是比较好理解,简单易操作
- 设计的程序结构过于简单,没有设计缓存层对象,程序的扩展性和维护性不好,也就是说,这种设计方案,吧产品和创建产品的过程封装在一起,耦合性增强了
解决方案:将产品和产品建造过程解耦 => 建造者模式
建造者模式
基本介绍
- 建造者模式又叫生成器模式,是一种对象构建模式。他可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同的表现(属性)的对象
- 建造者模式是一步一步构建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建他们,用户不需要知道内部的具体构建细节
建造者模式的四个角色
- (Product)产品角色:一个具体的产品对象
- (Build)抽象建造者:创建一个Product对象的各个部件指定的接口
- (ConcreteBuilder)具体建造者:实现接,构建和装配各个部件
- (Director)指挥者:构建一个使用Builder接口的对象。它主要是用于创建一个复杂对象。它主要有两个作用,一个是隔离了客户与对象的生产过程,另一个是负责控制产品对象的生产过程
改进方案
@Data
@AllArgsConstructor
@NoArgsConstructor
public class House {
private String basic;
private String wall;
private String roofed;
}
public abstract class HouseBuilder {
protected House house = new House();
/**
* 建造地基
*/
abstract void buildBasic();
/**
* 建造墙体
*/
abstract void buildWalls();
/**
* 建造屋顶
*/
abstract void roofed();
public House build(){
return house;
}
}
public class HighHouseBuilder extends HouseBuilder {
@Override
void buildBasic() {
System.out.println("建造高楼房子地基");
house.setBasic("高楼房子地基");
}
@Override
void buildWalls() {
System.out.println("建造高楼房子墙体");
house.setWall("高楼房子墙体");
}
@Override
void roofed() {
System.out.println("建造高楼房子屋顶");
house.setRoofed("高楼房子屋顶");
}
}
public class CommonHouseBuilder extends HouseBuilder {
@Override
void buildBasic() {
System.out.println("建造普通房子地基");
house.setBasic("普通房子地基");
}
@Override
void buildWalls() {
System.out.println("建造普通房子墙体");
house.setWall("普通房子墙体");
}
@Override
void roofed() {
System.out.println("建造普通房子屋顶");
house.setRoofed("普通房子屋顶");
}
}
public class HouseDirector {
HouseBuilder houseBuilder = null;
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//建造房子的流程由指挥者来安排
public House constructHouse(){
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.build();
}
}
public class Client {
public static void main(String[] args) {
CommonHouseBuilder commonHouseBuilder = new CommonHouseBuilder();
HouseDirector houseDirector = new HouseDirector(commonHouseBuilder);
House house = houseDirector.constructHouse();
System.out.println(house.toString());
houseDirector.setHouseBuilder(new HighHouseBuilder());
house = houseDirector.constructHouse();
System.out.println(house.toString());
}
}