一,建造者模式
建造者模式:
- 又叫生成器模式,一种对象构建模式,将复杂对象的建造过程抽象出来,抽象的方法可以由子类不同的需求实现出来;
- 建造者模式是一步一步创建一个复杂对象的,只通过指定复杂对象的类型和内容就可以构建出来,使用者不需要知道具体的内部细节;
二,原理类图
意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用性:
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
三,实例
四个角色:
- Produce(产品:具体对象);
- Builder(抽象建造者:创建Produce的接口、抽象类,只负责产品对象构建的整个流程,不关心细节);
- ConcreteBuilder(具体建造者:Builder的实现,用于构建和组装具体的Produce);
- Director(指挥者:构建一个调用Builder的对象,用于创建复杂对象,即隔离了客户与对象的生产过程,又负责控制 产品对象的生产过程)
1,Produce:
package com.neei.builder;
/**
* 产品Produce
*/
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;
}
}
2,Builder:
package com.neei.builder;
/**
* Builder(抽象建造者:创建Produce的接口、抽象类,只负责产品对象构建的整个流程,不关心细节)
*/
public abstract class HouseBuilder {
//需要组合进来需要建造的产品类
protected House house=new House();
//构建对象的流程
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void buildFooled();
//返回构建的对像
public House buildHouse(){
return house;
}
}
3,ConcreteBuilder:
package com.neei.builder;
/**
* 具体建造者:Builder的实现,用于构建和组装具体的Produce
*/
public class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("普通房子打地基");
}
@Override
public void buildWalls() {
System.out.println("普通房子砌墙");
}
@Override
public void buildFooled() {
System.out.println("普通房子盖顶");
}
}
package com.neei.builder;
/**
* 具体建造者:Builder的实现,用于构建和组装具体的Produce
*/
public class HighHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("高楼打地基");
}
@Override
public void buildWalls() {
System.out.println("高楼砌墙");
}
@Override
public void buildFooled() {
System.out.println("高楼盖顶");
}
}
4,Director:
package com.neei.builder;
/**
* 指挥者:构建一个调用Builder的对象,用于创建复杂对象,
* 即隔离了客户与对象的生产过程,又负责控制产品对象的生产过程
*/
public class HouseDirector {
private HouseBuilder builder;
public HouseDirector() {
}
public HouseDirector(HouseBuilder builder) {
this.builder = builder;
}
public void setBuilder(HouseBuilder builder) {
this.builder = builder;
}
/**
* 责控制产品对象的生产过程
*/
public House constructHouse() {
builder.buildBasic();
builder.buildWalls();
builder.buildFooled();
return builder.buildHouse();
}
}
调用
package com.neei.builder;
/**
* @param
* @Author: AaNeei
* @Date: 2019/9/25 22:29
* @Description: 游学网
* @throws:
*/
public class Client {
public static void main(String[] args) {
HouseDirector director1 = new HouseDirector(new CommonHouse());
director1.constructHouse();
HouseDirector director2 = new HouseDirector(new HighHouse());
director2.constructHouse();
}
}
四,源码分析
JDK源码中使用的建造者模式,如java.lang.StringBuilder#append方法;