Search code examples
javadesign-patternsbuilder

I'm trying to understand the Building Pattern and I have trouble with the Director


I try to code a builder pattern for my better understanding. Mostly I relied on GOF and wikipedia. So my Object is a house with required attribute area and some optional attributes (like windows, doors, rooms etc.) I will show you the code. Now, I'm not really sure if its correct and I think I don't have a director? I don't get in which cases you need one and how it works.

This is my class house and the innerclass 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);

     }
}

Now, I just got a class demo where I can build a house like that:

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

But this is not a director like in the books. Is my idea even correct? And why is that better than just using setters?

Thanks!


Solution

  • Your example illustrates classic builder. Director is something like an abstract builder, and in practise it is rarely used because the client class can handle that perfectly well. Example of a director in your case would be:

    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); 
        } 
    }
    

    Hope this helps clarify what is a Director in Builder pattern.