设计模式中创建型模式主要包括5种,其中单例模式、工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)、原型模式已经在前面的博文中更新,本文将讲解创建型模式中剩余的最后一种设计模式:建造则模式。
其余四种设计模式链接直达:
设计模式之创建型模式:单例模式
设计模式之创建型模式:工厂模式
设计模式之创建型模式:原型模式
设计模式用UML类图才能讲解的更清楚,本文核心也是看懂建造者模式的UML类图,如果您对类图还不了解,请先看我这篇讲解类图的文章:快速读懂UML类图,搞懂类之间的6大关系,轻松绘制UML类图
建造者设计模式主要用于创建步骤繁多的对象,该模式实现将产品与产品的创建过程解耦,使得代码具有较强的维护性及可扩展性。
该角色最终用户要得到的对象。
该角色是一个抽象类或者接口,用于指定对象创建的步骤。
该角色是对抽象建造者的具体实现。
该角色指定对象的创建过程,最终完成复杂对象的创建。

其中Client是指客户端,即用户最终只需要调用指挥者和具体创建者就可以完成复杂对象的构建,而无需关心内部具体的创建细节。

盖房子的具体实现由具体建造者完成,然后由指挥者负责楼房的具体建造步骤,实现产品与产品过程的解耦。
并且就该案例而言,通过建造者模式,如果我们想新加一种房子类型,只需要扩展一个房子类型即可,其余代码多不用修改,满足开闭原则。
//产品角色
public class House {
private String basic;
private String wall;
private String roofed;
public String getBasic() {
return basic;
}
public void setBasic(String basic) {
this.basic = basic;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoofed() {
return roofed;
}
public void setRoofed(String roofed) {
this.roofed = roofed;
}
}
//抽象建造者角色
public abstract class ABSHouse {
protected House house = new House();
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void roofed();
public House getHouse()
{
return house;
}
}
//具体建造者角色:普通房子
public class CommonHouse extends ABSHouse {
@Override
public void buildBasic() {
System.out.println("普通房子打桩");
house.setBasic("普通房子打桩完成");
}
@Override
public void buildWalls() {
System.out.println("普通房子砌墙");
house.setWall("普通房子砌墙完成");
}
@Override
public void roofed() {
System.out.println("普通房子封顶");
house.setWall("普通房子封顶完成");
}
}
//具体建造者角色:高楼
public class HighHouse extends ABSHouse {
@Override
public void buildBasic() {
System.out.println("高楼打桩");
house.setBasic("高楼打桩完成");
}
@Override
public void buildWalls() {
System.out.println("高楼砌墙");
house.setWall("高楼砌墙完成");
}
@Override
public void roofed() {
System.out.println("高楼房子封顶");
house.setWall("高楼房子封顶完成");
}
}
//具体建造者角色:别墅
public class VillaHouse extends ABSHouse {
@Override
public void buildBasic() {
System.out.println("别墅房打桩");
house.setBasic("别墅房打桩完成");
}
@Override
public void buildWalls() {
System.out.println("别墅房砌墙");
house.setWall("别墅房砌墙完成");
}
@Override
public void roofed() {
System.out.println("别墅房封顶");
house.setWall("别墅房封顶完成");
}
}
//指挥者角色
public class Director {
private ABSHouse absHouse;
public Director(ABSHouse absHouse)
{
this.absHouse=absHouse;
}
public House createHouse()
{
absHouse.buildBasic();
absHouse.buildWalls();
absHouse.roofed();
return absHouse.getHouse();
}
}
//客户端使用
public class Client {
public static void main(String[] args) {
CommonHouse commonHouse = new CommonHouse();
Director director = new Director(commonHouse);
House house = director.createHouse();
HighHouse highHouse = new HighHouse();
director=new Director(highHouse);
House house1 = director.createHouse();
}
}