定义:Builder模式也叫建造者模式或者生成器模式,Builder模式是一种对象创建型模式之一,用来隐藏复合对象(对象的属性为另一个对象的引用)的创建过程,它把复合对象的创建过程交给Builder,通过Director来指导Builder创建对象。
一、模式中包含的角色及其职责
- 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。
- 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
- 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品、返回组建好的产品。
- 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
二、Demo
产品类
/** *@desc 房子 复合对象 *@auther yangshijing *@date 2018-3-20 */ public class House { /** * 地板,此应该为另一个对象的引用,为了更好理解建造者模式,这里简化为String类型 */ private String floor; // 墙 private String wall; // 屋顶 private String housetop; public String getFloor() { return floor; } public void setFloor(String floor) { this.floor = floor; } public String getWall() { return wall; } public void setWall(String wall) { this.wall = wall; } public String getHousetop() { return housetop; } public void setHousetop(String housetop) { this.housetop = housetop; } }
抽象建造者
/* * 工程队,两个方法,建造产品,返回产品 */ public interface HouseBuilder { //修地板 public void makeFloor(); //修墙 public void makeWall(); //修屋顶 public void makeHousetop();
//返回产品 public House getHouse(); }
建造者
/* * 平房工程队 */ /** *@desc 平房建造者 *@auther yangshijing *@date 2018-3-20 */ public class PingFangBuilder implements HouseBuilder { House house = new House(); public void makeFloor() { house.setFloor("平房-->地板"); } public void makeHousetop() { house.setHousetop("平房-->房顶"); } public void makeWall() { house.setWall("平房-->墙"); } public House getHouse() { return house; } }
/** *@desc 公寓建造者 *@auther yangshijing *@date 2018-3-20 */ public class GongyuBuilder implements HouseBuilder{ House house = new House(); public House getHouse() { return house; } public void makeFloor() { house.setFloor("公寓-->地板"); } public void makeHousetop() { house.setHousetop("公寓-->房顶"); } public void makeWall() { house.setWall("公寓-->墙"); } }
导演类
public class HouseDirector { /**
*指导建造者创建产品
*/ public void makeHouse(HouseBuilder builder) { builder.makeFloor(); builder.makeWall(); builder.makeHousetop(); } }
测试类
public class MainClass { public static void main(String[] args) { //调用者只需创建Builder 和Director,如果想要生产不同的产品,只需创建不同的Builder实现类 HouseBuilder builder = new GongyuBuilder(); HouseDirector director = new HouseDirector(); director.makeHouse(builder); House house = builder.getHouse(); System.out.println(house.getFloor()); System.out.println(house.getWall()); System.out.println(house.getHousetop()); } }