понедельник, 8 августа 2011 г.

Паттерн Builder (Строитель). Пример кода


/**
 * Интерфейс, описывающий части, из которых может состоять здание
 * Методы специально не сделаны абстрактными, что бы иметь возможность
 * не строить ненужные части здания
 */
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 этаж. Плоская крыша. 
 */

Комментариев нет:

Отправить комментарий