简介:
建造者模式也是创建对象的一种模式,这种模式把一个复杂对象的属性构建和对象组装分离执行来实现两者解耦。不同的构建器和不同组装都能创建出不同的对象。常见以Builder结尾的大都是用了构建者模式
实现方式及测试总结见如下
1
/**
* 酒店实体类,包含各种属性
* @author dedu
*
*/
public class Hotel {
private Brand brand;
private Facilities facilities;
private Room room;
public Brand getBrand() {
return brand;
}
public void setBrand(Brand brand) {
this.brand = brand;
}
public Facilities getFacilities() {
return facilities;
}
public void setFacilities(Facilities facilities) {
this.facilities = facilities;
}
public Room getRoom() {
return room;
}
public void setRoom(Room room) {
this.room = room;
}
public Hotel(Brand brand, Facilities facilities, Room room) {
super();
this.brand = brand;
this.facilities = facilities;
this.room = room;
}
@Override
public String toString() {
return "Hotel [brand=" + brand + ", facilities=" + facilities + ", room=" + room + "]";
}
}
/**
* 酒店品牌属性
* @author dedu
*
*/
public class Brand {
private String name;
public Brand(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
/**
* 酒店基础设施属性
* @author dedu
*
*/
public class Facilities {
private List<String> facilities;
public Facilities(List<String> facilities) {
super();
this.facilities = facilities;
}
public List<String> getFacilities() {
return facilities;
}
public void setFacilities(List<String> facilities) {
this.facilities = facilities;
}
@Override
public String toString() {
return String.join("-", facilities);
}
}
/**
* 酒店房型属性
* @author dedu
*
*/
public class Room {
private String name;
private String bed;
public Room(String name, String bed) {
super();
this.name = name;
this.bed = bed;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBed() {
return bed;
}
public void setBed(String bed) {
this.bed = bed;
}
@Override
public String toString() {
return String.join("-", name, bed);
}
}
/**
* 建造者接口,生成组成实体的各个属性
* @author dedu
*
*/
public interface IHotelBuilder {
Brand buildBrand();
Facilities buildFacilities();
Room buildRoom();
}
/**
* 实现建造者接口,具体生成不同的属性,如携程渠道
* @author dedu
*
*/
public class CtripBuilder implements IHotelBuilder {
@Override
public Brand buildBrand() {
return new Brand("携程品牌");
}
@Override
public Facilities buildFacilities() {
List<String> facilities = Arrays.asList("有窗" ,"免费WIFI");
return new Facilities(facilities );
}
@Override
public Room buildRoom() {
return new Room("标间", "大床");
}
}
/**
* 生成亚朵渠道酒店构建者
* @author dedu
*
*/
public class AtourBuilder implements IHotelBuilder {
@Override
public Brand buildBrand() {
return new Brand("亚朵品牌");
}
@Override
public Facilities buildFacilities() {
List<String> facilities = Arrays.asList("落地窗" ,"收费WIFI", "免费停车");
return new Facilities(facilities );
}
@Override
public Room buildRoom() {
return new Room("豪华单间", "大床");
}
}
/**
* 指导者,根据不同的构建者生成不同的属性,最后组装成实体类对象
* @author dedu
*
*/
public class HotelBuilderDirector {
private IHotelBuilder hotelBuilder;
public Hotel buildHotel() {
return new Hotel(hotelBuilder.buildBrand(), hotelBuilder.buildFacilities(), hotelBuilder.buildRoom());
}
public HotelBuilderDirector(IHotelBuilder hotelBuilder) {
super();
this.hotelBuilder = hotelBuilder;
}
}
测试
public static void main(String[] args) {
HotelBuilderDirector director = new HotelBuilderDirector(new CtripBuilder());
Hotel ctriphotel = director.buildHotel();
System.out.println(ctriphotel);
HotelBuilderDirector director2 = new HotelBuilderDirector(new AtourBuilder());
Hotel atourHotel = director2.buildHotel();
System.out.println(atourHotel);
}