В настоящее время я работаю над шаблоном строителя. Есть одна вещь, которую я не понимаю, и это следующее. Предположим, я хочу создавать компьютеры, ноутбуки и настольные. Должен ли я создать ComputerBuilder
, который будет использовать другой процесс в зависимости от параметра I, который я передаю ему, или мне следует создать LaptopBuilder
и a DesktopBuilder
? Я видел оба примера кода в Интернете. Википедия использует второй метод в своем примере пиццы. Для меня это больше похоже на заводскую модель, но я мог бы использовать внешний свет. Благодаря!Builder pattern precision
ответ
Создайте абстрактный строитель и доведите его до двух подклассов конкретного строителя. Это абстрагирует логику.
Вот пример кода. В этом коде три абстрактных метода определены в абстрактном классе. Расширяющиеся классы могут выбрать, какие из них реализовать. Наконец, все абстрактные классы реализуют абстрактный метод и возвращают компьютер.
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?
- 1. Builder pattern
- 2. Builder design pattern
- 3. Design Pattern: Builder
- 4. Builder pattern multiple varargs
- 5. Builder Pattern and Inheritance
- 6. Java generics + Builder pattern
- 7. Effective Java: Builder Pattern
- 8. Тестирование Builder Pattern
- 9. Повторы в Builder Pattern
- 10. Builder Pattern and Persistence
- 11. Ограничитель Builder Pattern Parameter
- 12. Jackson with Builder Pattern
- 13. Pseudo-Backward Builder Pattern?
- 14. C# Builder Pattern
- 15. Builder pattern vs Factory Mmethod pattern
- 16. Builder Pattern более одного директора
- 17. Simple XML Serialization + Builder pattern
- 18. Builder pattern, где следует применять
- 19. Builder pattern vs. config object
- 20. Builder pattern - чтение конфигурационного файла
- 21. C++ Builder Pattern with Inheritance
- 22. Javascript builder pattern с использованием частных переменных
- 23. именованные параметры vs type-safe builder pattern
- 24. Generic Type From Enum & The Builder Pattern
- 25. Builder Pattern: Почему директор конструирует объект?
- 26. C++ Builder Pattern, основанный на конфигурации
- 27. Builder pattern vs Structure as parameter
- 28. Builder Pattern, с публичным конструктором vaild
- 29. Builder Pattern: в чем смысл директора?
- 30. Builder Pattern в Ruby с YAML
Не является ли это фабричный метод? –
Насколько я знаю, это шаблон Builder. Я только начал изучать их в этом году, но я привел этот пример почти прямо из Тони Бевиса «Основы дизайна шаблона». –
Ваш пример на самом деле хорош. Это строитель, потому что оба класса «Builder» делают разные вещи. По какой-то причине я не смог понять это, пока не увидел пример в книге GOF, где у разработчика была открытая функция 'doSomething()', которая затем называлась private 'doThing()'. Это действительно заставило меня понять идею внутренней логики, которая может отличаться от конструкции к строителю. Для меня пример Википедии по-прежнему является довольно плохим примером, который не показывает, что может сделать Builder. –