一、什么是建造者模式?
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
二、适用场景:
1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同的表示时。
三、模式中包含的角色及其职责
在这样的设计模式中,有以下几个角色:
1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
四、具体代码:
/**
* @Title: House.java
* @Package
* @Description: product--表示构造的复杂对象
* @author xiaozhi
* @date 2016年12月2日 下午6:41:32
* @version V1.0
*/
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;
}
}
/**
* @Title: HouseBuider.java
* @Package
* @Description: 为创建一个产品对象的各个部件指定抽象接口。--施工队
* @author xiaozhi
* @date 2016年12月2日 下午6:52:05
* @version V1.0
*/
public interface HouseBuider {
public void makeFloor();
public void makeWall();
public void makeHousetop();
public House getHouse();
}
/**
* @Title: PingFangBuider.java
* @Package
* @Description: ConcreteBuilder--平房施工队
* @author xiaozhi
* @date 2016年12月2日 下午6:55:19
* @version V1.0
*/
public class PingFangBuider implements HouseBuider {
House house = new House();
@Override
public void makeFloor() {
house.setFloor("平房-修建地板");
}
@Override
public void makeWall() {
house.setWall("平房-修建墙壁");
}
@Override
public void makeHousetop() {
house.setHousetop("平房-修建房顶");
}
public House getHouse() {
return this.house;
}
}
/**
* @Title: GongyuBuider.java
* @Package
* @Description: ConcreteBuilder--公寓施工队
* @author xiaozhi
* @date 2016年12月2日 下午7:16:34
* @version V1.0
*/
public class GongyuBuider implements HouseBuider {
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 this.house;
}
}
/**
* @Title: HouseDirector.java
* @Package
* @Description: 构造一个使用Builder接口的对象。---设计师
* @author xiaozhi
* @date 2016年12月2日 下午7:09:40
* @version V1.0
*/
public class HouseDirector {
// 构造一个使用Builder接口的对象
HouseBuider houseBuider;
public HouseDirector(HouseBuider houseBuider) {
this.houseBuider = houseBuider;
}
public void makeHouse() {
houseBuider.makeFloor();
houseBuider.makeHousetop();
houseBuider.makeWall();
}
}
/**
* @Title: MainClass.java
* @Package
* @Description: 测试类
* @author xiaozhi
* @date 2016年12月2日 下午6:41:49
* @version V1.0
*/
public class MainClass {
public static void main(String[] args) {
//
// House house=new House();
// house.setFloor("地板");
// house.setWall("墙壁");
// house.setHousetop("屋顶");
//
// System.out.println(house.getFloor());
// System.out.println(house.getHousetop());
// System.out.println(house.getWall());
// 创建平房施工队
HouseBuider houseBuider = new PingFangBuider();
// 设计者请来平房施工队
HouseDirector houseDirector = new HouseDirector(houseBuider);
// 设计者通过调用平房施工队建造房子
houseDirector.makeHouse();
House house = houseBuider.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getWall());
System.out.println(house.getHousetop());
System.out.println();
System.out.println();
// 公寓施工队
HouseBuider houseBuider1 = new GongyuBuider();
HouseDirector houseDirector1 = new HouseDirector(houseBuider1);
houseDirector1.makeHouse();
House house1 = houseBuider1.getHouse();
System.out.println(house1.getFloor());
System.out.println(house1.getWall());
System.out.println(house1.getHousetop());
}
}
五、测试结果:
平房-修建地板
平房-修建墙壁
平房-修建房顶
公寓-修建地板
公寓-修建墙壁
公寓-修建屋顶