/**
* Интерфейс, описывающий части, из которых может состоять здание
* Методы специально не сделаны абстрактными, что бы иметь возможность
* не строить ненужные части здания
*/
public abstract class Builder {
public void buildFundament() {
}
public void buildFloor() {
}
public void buildRoof() {
}
public void buildBasement() {
}
abstract Object getBuilding();
}
public class FrameHouseBuilder extends Builder {
private FrameHouse fh = new FrameHouse();
public void buildFundament() {
fh.setPart("Фундамент. ");
}
public void buildFloor() {
fh.setPart("1 этаж. ");
}
public void buildRoof() {
fh.setPart("Двускатная крыша. ");
}
@Override
public FrameHouse getBuilding() {
return fh;
}
}
public class OfficeBuildingBuilder extends Builder {
private OfficeBuilding ob = new OfficeBuilding();
private int floors = 0;
public void buildFundament() {
ob.setPart("Фундамент. ");
}
public void buildBasement() {
ob.setPart("Подвал. ");
}
public void buildFloor() {
floors++;
ob.setPart(floors + " этаж. ");
}
public void buildRoof() {
ob.setPart("Плоская крыша. ");
}
@Override
public OfficeBuilding getBuilding() {
return ob;
}
}
public class FrameHouse {
private StringBuilder parts = new StringBuilder();
public void setPart(String part) {
parts.append(part);
}
public String getParts() {
return parts.toString();
}
}
public class OfficeBuilding {
private StringBuilder parts = new StringBuilder();
public void setPart(String part) {
parts.append(part);
}
public String getParts() {
return parts.toString();
}
}
/**
* Распорядитель. Собирает различные виды зданий
*/
public class Director {
public static FrameHouse getFrameHouse() {
FrameHouseBuilder fhb = new FrameHouseBuilder();
fhb.buildFundament();
fhb.buildFloor();
fhb.buildRoof();
return fhb.getBuilding();
}
public static OfficeBuilding getOfficeBuilding() {
OfficeBuildingBuilder fhb = new OfficeBuildingBuilder();
fhb.buildBasement();
fhb.buildFundament();
for (int i=0; i < 5; i++) {
fhb.buildFloor();
}
fhb.buildRoof();
return fhb.getBuilding();
}
}
public class Application {
public static void main(String[] args) {
FrameHouse fh = Director.getFrameHouse();
System.out.println(fh.getParts());
OfficeBuilding ob = Director.getOfficeBuilding();
System.out.println(ob.getParts());
}
}
/*
* Output:
* Фундамент. 1 этаж. Двускатная крыша.
* Подвал. Фундамент. 1 этаж. 2 этаж. 3 этаж. 4 этаж. 5 этаж. Плоская крыша.
*/
понедельник, 8 августа 2011 г.
Паттерн Builder (Строитель). Пример кода
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий