📢 专栏推荐:23种设计模式(Java版)系列专栏
2021 年 1 月 1 日 百思不得小赵 🔍点此进入播客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀
建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。----------来源于百度百科
通俗理解:
案例需求:
需要建房子:这一过程为打桩、砌墙、封顶 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的
案例代码:
//产品
public class House {
private String baise;
private String wall;
private String roofed;
public String getBaise() {
return baise;
}
public void setBaise(String baise) {
this.baise = baise;
}
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 HouseBuilder {
private House house = new House();
// 建造流程
// 打地基
public abstract void buildBasic();
// 砌墙
public abstract void buildWall();
// 封顶
public abstract void roofed();
//建造完房子,返回
public House build() {
return house;
}
}
public class CommonHouse extends HouseBuilder{
@Override
public void buildBasic() {
// TODO Auto-generated method stub
System.out.println("普通房子打地基");
}
@Override
public void buildWall() {
// TODO Auto-generated method stub
System.out.println("普通房子砌墙");
}
@Override
public void roofed() {
// TODO Auto-generated method stub
System.out.println("普通房封顶");
}
}
//指挥者 动态指定制作流程,返回具体产品
public class HouseDirector {
private HouseBuilder houseBuilder = null;
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//如何建造房子,交给指挥者
public House creatHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWall();
houseBuilder.roofed();
return houseBuilder.build();
}
}
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//盖普通房子
new HouseDirector(new CommonHouse()).creatHouse();
}
}
StringBuilder中使用到了建造者模式
Appendable 接口定义了多个append方法(抽象方法), 即Appendable 为抽象建造者, 定义了抽象方法
public interface Appendable {
Appendable append(CharSequence csq) throws IOException;
Appendable append(CharSequence csq, int start, int end) throws IOException;
Appendable append(char c) throws IOException;
}
AbstractStringBuilder 实现了 Appendable 接口方法,这里的AbstractStringBuilder 已经是建造者,只是不能实例化.
abstract class AbstractStringBuilder implements Appendable, CharSequence {}
StringBuilder 即充当了指挥者角色,同时充当了具体的建造者,建造方法的实现是由 AbstractStringBuilder 完成, 而StringBuilder 继承了AbstractStringBuilder
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
{
public StringBuilder append(StringBuffer sb) {
super.append(sb);
return this;
}
@Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}
}