1

我目前正在研究构建器模式。有一件事我没有得到,它是以下内容。假设我想创建计算机、笔记本电脑和台式机。我应该ComputerBuilder根据传递给它的参数创建一个使用不同进程的 a ,还是应该创建 aLaptopBuilder a DesktopBuilder?我在网上的代码示例中都看到过。Wikipedia 在其比萨饼示例中使用了第二种方法。对我来说,这看起来更像是工厂模式,但我可以使用一些外部光源。谢谢!

4

1 回答 1

1

创建一个抽象构建器并将其扩展到两个具体的构建器子类。这将逻辑抽象出来。

这是一些示例代码。在这段代码中,抽象类中定义了三个标准方法。扩展类可以选择实现其中的哪一个。最后,所有抽象类都将实现抽象方法并返回一台计算机。

public abstract class Builder {

    public void doSomethingA() {};
    public void doSomethingB() {};
    public void doSomethingC() {};
    public abstract Computer returnComputer();
}

现在,LaptopBuilder 类扩展了这个抽象类,并有自己的两个方法版本:

public class LaptopBuilder {

    private Computer computer;

    public LaptopBuilder(Computer computer) {
        this.computer = computer;
    }

    public void doSomethingA() {
        System.out.println("Laptop Method A");
    }

    public void doSomethingB() {
        System.out.println("Laptop Method B");
    }

    public Computer returnComputer() {
        return computer;
    }
}

最后,DesktopBuilder 类扩展了抽象类,并有自己的两个方法版本:

public class DesktopBuilder {

    private Computer computer;

    public DesktopBuilder(Computer computer) {
        this.computer = computer;
    }

    public void doSomethingB() {
        System.out.println("Desktop Method B");
    }

    public void doSomethingC() {
        System.out.println("Desktop Method C");
    }

    public Computer returnComputer() {
        return computer;
    }
}

现在所需要的就是创建一个director抽象类,以及一个台式机和笔记本电脑的具体director:

public abstract class Director {
    public abstract Computer build(Builder builder);
}

public class LaptopDirector extends Director {
    public Computer build(Builder builder) {
        builder.doSomethingA();
        builder.doSomethingB();
        return builder.returnComputer();
    }
}

public class DesktopDirector extends Director {
    public Computer build(Builder builder) {
        builder.doSomethingB();
        builder.doSomethingC();
        return builder.returnComputer();
    }
}

最后,在您的客户端中,只需创建您的计算机,创建相关构建器,创建相关导向器并调用构建方法。

编辑:这篇文章也可能很有价值:你什么时候使用构建器模式?

于 2013-05-21T19:45:15.610 回答