java - 我正在尝试理解建筑模式,但我与导演之间存在问题

标签 java design-patterns builder

我尝试编写构建器模式以更好地理解。我主要依赖 GOF 和维基百科。 所以我的对象是一个具有必需属性区域和一些可选属性(如 window 、门、房间等)的房子 我将向您展示代码。现在,我不太确定它是否正确,我想我没有导演?我不明白在哪些情况下您需要一个以及它是如何工作的。

这是我的类(class)房屋和内部类(class) 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);

     }
}

现在,我刚刚得到了一个类演示,我可以在其中 build 这样的房子:

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

但这并不是书中那样的导演。我的想法是否正确?为什么这比仅仅使用 setter 更好?

谢谢!

最佳答案

您的示例说明了经典构建器。 Director 类似于一个抽象构建器,在实践中很少使用它,因为客户端类可以很好地处理它。您的案例中的董事示例如下:

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

希望这有助于澄清什么是 Builder 模式中的 Director。

关于java - 我正在尝试理解建筑模式,但我与导演之间存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58375238/

相关文章:

使用 Spring Boot 时未初始化 java.lang.IllegalStateException LifecycleProcessor 和 ApplicationEventMulticaster

java - 这是什么设计模式——适配器、提供者、委托(delegate)、模板方法,还是……?

delphi - 如何使用 TForm 后代的泛型实现单例模式?

java - 谷歌日历 : how to access it on android

java - 什么时候需要将 java 中的十六进制文字转换为(字节)?

java - 我可以在同一个 Swing 应用程序中使用两种不同的外观吗?

java - 如何清理我的 Java Stream?

reporting-services - SSRS 错误 - tablix ‘Tablix1’ 具有包含内部成员的详细成员。详细成员只能包含静态内部成员

design-patterns - 抽象工厂、工厂方法、生成器

ruby-on-rails - Rails 3 - 在任何来源中都找不到 rake-0.9.2 (Bundler::GemNotFound)