重拾设计模式-构建者模式

简介:
建造者模式也是创建对象的一种模式,这种模式把一个复杂对象的属性构建和对象组装分离执行来实现两者解耦。不同的构建器和不同组装都能创建出不同的对象。常见以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);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值