前言:
Builder建造者设计模式,用来隐藏复合对象的创建过程,把复合对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
我感觉比较明显的一个优点是:把对象创建和业务代码分离,代码清晰易懂,便于代码的维护,不用把复杂的对象创建过程融合到业务逻辑代码中。
怎么实现?
1.有一个复合的对象,称之为product,最终要创建的产品。
2.抽象建造者,利用多态的特性,用来接收真实建造者。
3.真实建造者,用来创建一个具体的复合对象及各个属性,及返回对象的方法
4.设计师,根据建造者,设计出最终产品
代码:
创建房子实体类House:
package com.xhx.designpattern.entity;
public class House {
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;
}
}
如果直接建房子:
//直接造房子
// House house=new House();
// house.setFloor("地板");
// house.setHousetop("房顶");
// house.setWall("墙");
上面这个代码肯定不是咱们想要的,如果house对象更加复杂,直接写在业务代码里或者是在业务类中抽出一个方法,简直都不能忍。
创建一个建造房子的接口:
package com.xhx.designpattern;
import com.xhx.designpattern.entity.House;
/**
* 工程队
*/
public interface HouseBuilder {
//修地板
public void makeFloor();
//修墙
public void makeWall();
//修屋顶
public void makeHousetop();
public House getHouse();
}
下面建造者 建平房:
package com.xhx.designpattern;
import com.xhx.designpattern.entity.House;
/**
* 平房工程队
*/
public class PingFangBuilder implements HouseBuilder{
House house = new House();
@Override
public void makeFloor() {
house.setFloor("平房-->地板");
}
@Override
public void makeWall() {
house.setWall("平房-->墙");
}
@Override
public void makeHousetop() {
house.setHousetop("平房-->房顶");
}
@Override
public House getHouse() {
return house;
}
}
如果由建造者建房子:
//HouseBuilder builder = new PingFangBuilder();
// builder.makeFloor();
// builder.makeHousetop();
// builder.makeWall();
这样也不好,业务逻辑代码中都是makeXXX,和上面直接建房子(setXXX)没区别
下面创建一个房子设计师:
package com.xhx.designpattern;
public class HouseDirecter {
//其实也没必要加一个属性,构造函数传参,
//makeHourse方法加个入参HouseBuilder 就可以了
private HouseBuilder builder;
public HouseDirecter(HouseBuilder builder){
this.builder=builder;
}
public void makeHourse(){
builder.makeFloor();
builder.makeWall();
builder.makeHousetop();
}
}
下面由设计师来造房子:
HouseBuilder builder = new PingFangBuilder();
HouseDirecter directer = new HouseDirecter(builder);
directer.makeHourse();
看一下这三种造房子主方法:
package com.xhx.designpattern;
import com.xhx.designpattern.entity.House;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
//直接造房子
// House house=new House();
// house.setFloor("地板");
// house.setHousetop("房顶");
// house.setWall("墙");
//由工程对来修
//HouseBuilder builder = new PingFangBuilder();
HouseBuilder builder = new GongyuBuilder();
// builder.makeFloor();
// builder.makeHousetop();
// builder.makeWall();
//由设计者来做
HouseDirecter directer = new HouseDirecter(builder);
directer.makeHourse();
House house = builder.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getHousetop());
System.out.println(house.getWall());
}
}
建造者设计模式其实就是把创建复杂对象的过程一步一步抽取出来,封装到外面的类中。