Я пытаюсь понять шаблон здания и у меня проблемы с директором - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь закодировать шаблон для лучшего понимания. В основном я опирался на GOF и википедию. Поэтому мой Объект - это дом с необходимой областью атрибутов и некоторыми дополнительными атрибутами (такими как окна, двери, комнаты и т. Д.). Я покажу вам код. Я не совсем уверен, правильно ли это, и думаю, что у меня нет директора? Я не понимаю, в каких случаях он вам нужен и как он работает.

Это мой классный дом и внутренний класс HouseBuilder

public class House {

    //required
    private final String area;

    //optional
    private int windows;
    private int doors;
    private int rooms;



    //constructor with HouseBuilder
    private House(HouseBuilder builder) {
        this.windows = builder.windows;
        this.doors = builder.doors;
        this.rooms = builder.rooms;


       }



    public static class HouseBuilder {

        //required
        private String area;

        //optional
        private int windows;
        private int doors;
        private int rooms;

        //constructor with required attributes
        HouseBuilder(String area) {
            this.area = area;
        }
                //optional attributes
        public HouseBuilder windows(int windows) {
            this.windows = windows;
            return this;
        }

        public HouseBuilder doors (int doors) {
            this.doors = doors;
            return this;
        }
           //function for building
            public Housebuild() {
                  return new House(this);

     }
}

Теперь я только что получил демоверсию класса, где яМожно построить такой дом:

House house = new House.HouseBuilder("Downtown")
              .doors(3).windows(2).build();

Но это не директор, как в книгах. Правильна ли моя идея? И почему это лучше, чем просто использование сеттеров?

Спасибо!

1 Ответ

0 голосов
/ 14 октября 2019

Ваш пример иллюстрирует классического строителя. Директор - это что-то вроде абстрактного компоновщика, и на практике он редко используется, потому что клиентский класс может справиться с этим на отлично. Примером директора в вашем случае будет:

public class House
{
    public final String area;

    public windows;
    public int doors;
    public int rooms;
}

interface HouseBuilder 
{ 
    public HouseBuilder area(); 

    public HouseBuilder windows(); 

    public HouseBuilder doorsors(); 

    public HouseBuilder rooms(); 

    public House build(); 
} 

public static class DowntownHouseBuilder implements HouseBuilder
{   
    House downtownHouse = new House();

    public HouseBuilder area()
    {
        downtownHouse.area = "Downtown";
    }

    public HouseBuilder windows()
    {
        downtownHouse.windows = 3;
        return this;
    }

    public HouseBuilder doors()
    {
        downtownHouse.doors = 2;
        return this;
    }

    public HouseBuilder rooms()
    {
        downtownHouse.rooms = 2;
        return this;
    }

    public House build()
    {
        return downtownHouse;
    }
}

public static class VilaBuilder implements HouseBuilder
{   
    House vila new House();

    public HouseBuilder area()
    {
        vila.area = "Downtown";
    }

    public HouseBuilder windows()
    {
        vila.windows = 24;
        return this;
    }

    public HouseBuilder doors()
    {
        vila.doors = 5;
        return this;
    }

    public HouseBuilder rooms()
    {
        downtownHouse.rooms = 10;
        return this;
    }

    public House build()
    {
        return vila;
    }
}

class Driector  
{ 
    private HouseBuilder houseBuilder; 

    public Driector(HouseBuilder houseBuilder) 
    { 
        this.houseBuilder = houseBuilder; 
    } 

    public House buildHouse() 
    { 
        return this.houseBuilder.area()
                                .windows()
                                .doors()
                                .rooms()
                                .buid();            
    } 
}

class HouseConstruction
{ 
    public static void main(String[] args) 
    {
        Director director = new Director(new VilaBuilder()); 

        House house = director.buildHouse(); 

        System.out.println("Builder constructed: "+ house); 
    } 
}

Надеюсь, это поможет уточнить, что такое шаблон Director в Builder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...