1)建造者模式(Builder Pattern)又叫生成器模式,是一种创建型模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构建出不同表现的对象
2)建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建他们,用户不需要知道具体的构建细节
盖房项目需求:
package com.zjh.designmodel.builder;
/**
* @Author: zjh
* @Description:
* @Date: Created in 2020/5/20 20:16
* Modified by:
*/
public abstract class AbstractHouse {
abstract void bulderBasic();
abstract void bulderWalls();
abstract void roofs();
}
package com.zjh.designmodel.builder;
/**
* @Author: zjh
* @Description:
* @Date: Created in 2020/5/20 20:17
* Modified by:
*/
public class CommonRoom extends AbstractHouse {
@Override
void bulderBasic() {
System.out.println("普通房子地基打5米");
}
@Override
void bulderWalls() {
System.out.println("普通房子砌墙3厘米");
}
@Override
void roofs() {
System.out.println("普通房子封顶了");
}
public void builder(){
bulderBasic();
bulderWalls();
roofs();
}
}
package com.zjh.designmodel.builder;
/**
* @Author: zjh
* @Description:
* @Date: Created in 2020/5/20 20:18
* Modified by:
*/
public class TallBuilder extends AbstractHouse {
@Override
void bulderBasic() {
System.out.println("高楼打地基7米");
}
@Override
void bulderWalls() {
System.out.println("高楼砌墙5厘米");
}
@Override
void roofs() {
System.out.println("高楼封顶了");
}
public void builder(){
bulderBasic();
bulderWalls();
roofs();
}
}
package com.zjh.designmodel.builder;
/**
* @Author: zjh
* @Description:别墅类
* @Date: Created in 2020/5/20 20:19
* Modified by:
*/
public class Villa extends AbstractHouse{
@Override
void bulderBasic() {
System.out.println("别墅打地基9米");
}
@Override
void bulderWalls() {
System.out.println("别墅砌墙10厘米");
}
@Override
void roofs() {
System.out.println("别墅封顶了");
}
public void builder(){
bulderBasic();
bulderWalls();
roofs();
}
}
比较好理解,简单易操作
设计的程序结构过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说这种设计方案是吧产品(房子)和创建产品的过程(打地基、砌墙、封顶)放在了一起,耦合性增强。建造者模式就是为了把产品和创建产品的过程进行解耦
1.我们先创建一个产品类(HouseProduct),让其拥有地基、墙面、屋顶的属性
2.创建一个抽象建造者(可以理解为房地产公司),让其拥有房屋这个属性并且拥有打地基、砌墙、盖屋顶和创建房子的抽象方法(可以理解为房地产公司只负责说自己可以建造哪些房子,但是没有具体的房子)
3.然后在创建具体的房子构建者(可以理解为房地产公司的建房子的部门,他们负责建造具体的房子)
4.最后在创建指挥类(可以理解为包工头,他负责房子的具体建造顺序----比如普通房子地基不是很深,我们可以吧运砖快和打地基同时进行,但是高楼必须先打地基)
package com.zjh.designmodel.builder.designmodelbuilder.product;
import lombok.Data;
/**
* @Author: zjh
* @Description:
* @Date: Created in 2020/5/22 18:19
* Modified by:
*/
@Data
public class HouseProduct {
private String basic;//地基
private String walls;//墙面
private String roofs;//屋顶
}
package com.zjh.designmodel.builder.designmodelbuilder.builder;
import com.zjh.designmodel.builder.designmodelbuilder.product.HouseProduct;
/**
* @Author: zjh
* @Description:
* @Date: Created in 2020/5/22 18:20
* Modified by:
*/
public abstract class AbstractBuilder {
HouseProduct houseProduct=new HouseProduct();
public abstract void bulderBasic();
public abstract void bulderWalls();
public abstract void roofs();
public abstract HouseProduct createHouse();
}
package com.zjh.designmodel.builder.designmodelbuilder.builder;
import com.zjh.designmodel.builder.designmodelbuilder.product.HouseProduct;
/**
* @Author: zjh
* @Description:
* @Date: Created in 2020/5/22 18:22
* Modified by:
*/
public class CommonRoomBuilder extends AbstractBuilder {
@Override
public void bulderBasic() {
System.out.println("普通房子地基打5米");
}
@Override
public void bulderWalls() {
System.out.println("普通房子墙面10厘米");
}
@Override
public void roofs() {
System.out.println("普通房子进行封顶");
}
@Override
public HouseProduct createHouse() {
HouseProduct houseProduct = super.houseProduct;
houseProduct.setBasic("5米");
houseProduct.setRoofs("10厘米");
houseProduct.setRoofs("普通房子屋顶");
return houseProduct;
}
}
package com.zjh.designmodel.builder.designmodelbuilder.builder;
import com.zjh.designmodel.builder.designmodelbuilder.product.HouseProduct;
/**
* @Author: zjh
* @Description:
* @Date: Created in 2020/5/22 18:25
* Modified by:
*/
public class TallBuilder extends AbstractBuilder {
@Override
public void bulderBasic() {
System.out.println("高楼地基15米");
}
@Override
public void bulderWalls() {
System.out.println("高楼墙面30厘米");
}
@Override
public void roofs() {
System.out.println("高楼封顶");
}
@Override
public HouseProduct createHouse() {
HouseProduct houseProduct = super.houseProduct;
houseProduct.setBasic("15米");
houseProduct.setWalls("30厘米");
houseProduct.setRoofs("高楼封顶");
return houseProduct;
}
}
package com.zjh.designmodel.builder.designmodelbuilder.builder;
import com.zjh.designmodel.builder.designmodelbuilder.product.HouseProduct;
/**
* @Author: zjh
* @Description:
* @Date: Created in 2020/5/22 18:31
* Modified by:
*/
public class VillaBuilder extends AbstractBuilder {
@Override
public void bulderBasic() {
System.out.println("别墅地基10米");
}
@Override
public void bulderWalls() {
System.out.println("别墅墙面20厘米");
}
@Override
public void roofs() {
System.out.println("别墅封顶");
}
@Override
public HouseProduct createHouse() {
HouseProduct houseProduct = super.houseProduct;
houseProduct.setBasic("10米");
houseProduct.setWalls("20厘米");
houseProduct.setRoofs("别墅封顶");
return houseProduct;
}
}
package com.zjh.designmodel.builder.designmodelbuilder;
import com.zjh.designmodel.builder.designmodelbuilder.builder.AbstractBuilder;
import com.zjh.designmodel.builder.designmodelbuilder.builder.CommonRoomBuilder;
import com.zjh.designmodel.builder.designmodelbuilder.builder.TallBuilder;
import com.zjh.designmodel.builder.designmodelbuilder.builder.VillaBuilder;
import com.zjh.designmodel.builder.designmodelbuilder.product.HouseProduct;
/**
* @Author: zjh
* @Description:
* @Date: Created in 2020/5/22 18:33
* Modified by:
*/
public class Director {
private AbstractBuilder abstractBuilder;
public Director(AbstractBuilder abstractBuilder){
this.abstractBuilder=abstractBuilder;
}
public HouseProduct getCommonHouse() throws InterruptedException {
CommonRoomBuilder commonRoomBuilder= (CommonRoomBuilder) abstractBuilder;
//建造普通房子 地基和运砖的顺序可以同时,因为地基不是很深
commonRoomBuilder.bulderWalls();
commonRoomBuilder.bulderBasic();
Thread.sleep(500);
commonRoomBuilder.roofs();
return commonRoomBuilder.createHouse();
}
public HouseProduct getTailHouse() throws InterruptedException {
TallBuilder tallBuilder= (TallBuilder) abstractBuilder;
//建造高楼要先打地基
tallBuilder.bulderBasic();
Thread.sleep(500);
tallBuilder.bulderWalls();
Thread.sleep(500);
tallBuilder.roofs();
return tallBuilder.createHouse();
}
public HouseProduct getVillaHouse() throws InterruptedException {
VillaBuilder villaBuilder= (VillaBuilder) abstractBuilder;
//建造别墅
villaBuilder.bulderBasic();
Thread.sleep(500);
villaBuilder.bulderWalls();
Thread.sleep(500);
villaBuilder.roofs();
return villaBuilder.createHouse();
}
}
AbstractStringBuilder我们可以理解为抽象抽象建造者,StringBuilder可以理解为具体的施工者(StringBuilder这里吧社施工者和产品放在了一起),我们通过StringBuilder的append方法添加各种类型的数据到StringBuilder,然后StringBuilder在返给我们一个StringBuilder类型的字符串,可以把我们自己看成指挥者