2013-05-21 3 views
1

В настоящее время я работаю над шаблоном строителя. Есть одна вещь, которую я не понимаю, и это следующее. Предположим, я хочу создавать компьютеры, ноутбуки и настольные. Должен ли я создать ComputerBuilder, который будет использовать другой процесс в зависимости от параметра I, который я передаю ему, или мне следует создать LaptopBuilderи a DesktopBuilder? Я видел оба примера кода в Интернете. Википедия использует второй метод в своем примере пиццы. Для меня это больше похоже на заводскую модель, но я мог бы использовать внешний свет. Благодаря!Builder pattern precision

ответ

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

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

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

Наконец, на вашем клиенте просто создайте свой компьютер, создайте соответствующий строитель, создайте соответствующего директора и вызовите метод сборки.

Edit: Это сообщение может также иметь значение: When would you use the Builder Pattern?

+0

Не является ли это фабричный метод? –

+0

Насколько я знаю, это шаблон Builder. Я только начал изучать их в этом году, но я привел этот пример почти прямо из Тони Бевиса «Основы дизайна шаблона». –

+0

Ваш пример на самом деле хорош. Это строитель, потому что оба класса «Builder» делают разные вещи. По какой-то причине я не смог понять это, пока не увидел пример в книге GOF, где у разработчика была открытая функция 'doSomething()', которая затем называлась private 'doThing()'. Это действительно заставило меня понять идею внутренней логики, которая может отличаться от конструкции к строителю. Для меня пример Википедии по-прежнему является довольно плохим примером, который не показывает, что может сделать Builder. –