/**
 * {@link <a href=
 * "https://[Log in to view URL]"
 * target= "_blank"></a>}
 * 
 * @author itammb ( Italia Massimiliano Buscati )
 * @version JDK 1.15
 *
 */
class Main {
	public static interface HouseBuilder {
		public void setWall(Measurement measurment);

		public void setDoor(Measurement measurment);

		public void setWindows(Measurement measurment);

		public void setRoof(Measurement measurment);

		public void setGarage(Measurement measurment);

		public void setSwimmingPool(Measurement measurment);
	}

	public static class Measurement {
		public Measurement(double height, double width, double depth) {
			this.height = height;
			this.width = width;
			this.depth = depth;
		}

		public double getHeight() {
			return height;
		}

		public double getWidth() {
			return width;
		}

		public double getDepth() {
			return depth;
		}

		private final double height;
		private final double width;
		private final double depth;

		@Override
		public String toString() {
			return "Measurement [height=" + height + ", width=" + width + ", depth=" + depth + "]";
		}
	}

	public static class Apartment implements HouseBuilder {
		public void setWall(Measurement measurment) {
			wall = measurment;
		}

		public void setDoor(Measurement measurment) {
			door = measurment;
		}

		public void setWindows(Measurement measurment) {
			windows = measurment;
		}

		public void setRoof(Measurement measurment) {
			roof = measurment;
		}

		public void setGarage(Measurement measurment) {
			garage = measurment;
		}

		public void setSwimmingPool(Measurement measurment) {
			swimmingPool = measurment;
		}

		private Measurement wall, door, windows, roof, garage, swimmingPool;

		@Override
		public String toString() {
			return "Apartment [wall=" + wall + ", door=" + door + ", windows=" + windows + ", roof=" + roof
					+ ", garage=" + garage + ", swimmingPool=" + swimmingPool + "]";
		}
	}

	public static class ManagerBuilder {
		public static enum HOUSE {
			apartment, mansion
		}

		public ManagerBuilder(HouseBuilder builder) {
			this.builder = builder;
		}

		public HouseBuilder getBuilder() {
			return builder;
		}

		public void setBuilder(HouseBuilder builder, HOUSE house) {
			this.builder = builder;
			make(house);
		}

		private HouseBuilder builder;

		public void make(HOUSE house) {
			if (house.equals(HOUSE.apartment)) {
				builder.setWall(new Measurement(2.3, 5, 0.20));
				builder.setDoor(new Measurement(2, 0.6, 0.10));
				builder.setWindows(new Measurement(1.3, 1, 0.8));
				builder.setRoof(new Measurement(5, 5, 0.5));
				builder.setGarage(new Measurement(5, 5, 0.5));
				builder.setSwimmingPool(null);
			} else if (house.equals(HOUSE.mansion)) {
				builder.setWall(new Measurement(2.3, 5, 0.20));
				builder.setDoor(new Measurement(2, 0.6, 0.10));
				builder.setWindows(new Measurement(1.3, 1, 0.8));
				builder.setRoof(new Measurement(5, 5, 0.5));
				builder.setGarage(new Measurement(5, 5, 0.5));
				builder.setSwimmingPool(new Measurement(5, 5, 1.5));
			} else
				builder = null;
		}
	}

	public static void main(String args[]) {
		// Unit test - uso del design pattern: builder

		ManagerBuilder manager = new ManagerBuilder(new Apartment());
		manager.make(ManagerBuilder.HOUSE.apartment);

		HouseBuilder builder = manager.getBuilder();
		if (builder instanceof Apartment)
			System.out.println(((Apartment) manager.getBuilder()).toString());
	}
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: