воскресенье, 2 июня 2013 г.

Создание объектов с переменным числом параметров. Три способа.

1. Простой и понятный, но не самый изящный способ - использовать паттерн Телескоп


public class Menu {
    private final String salad; //optional
    private final String soup; //required
    private final String second; //required
    private final String tea; //optional
    private final String desert; //optional
    private final String fruits; //optional
    Menu(String soup, String second) {
        this(soup, second, null);
    }
    Menu(String soup, String second, String salad) {
        this(soup, second, salad, null);
    }
    Menu(String soup, String second, String salad, String tea) {
        this(soup, second, salad, tea, null);
    }
    Menu(String soup, String second, String salad, String tea, String desert) {
        this(soup, second, salad, tea, desert, null);
    }
    Menu(String soup, String second, String salad, String tea, String desert, String fruits) {
        this.soup = soup;
        this.second = second;
        this.salad = salad;
        this.tea = tea;
        this.desert = desert;
        this.fruits = fruits;
    }
}

2. Использовать класс с пустым конструктором и множеством сеттеров. Такой паттерн называется JavaBeans. Его недостатками являются возможность создать недоконструированный объект, а так же невозможность создавать Immutable-объекты


public class Menu {
    private String salad; //optional
    private final String soup; //required
    private final String second; //required
    private String tea; //optional
    private String desert; //optional
    private String fruits; //optional
    Menu(String soup, String second) {
        this.soup = soup;
        this.second = second;
    }

    public void setSalad(String salad) {
        this.salad = salad;
    }
    
    public void setTea(String tea) {
        this.tea = tea;
    }
    
    public void setDesert(String desert) {
        this.desert = desert;
    }
    
    public void setFruits(String fruits) {
        this.fruits = fruits;
    }
}

3. Использовать шаблон Строитель. Немного усложненная структура, но зато как красиво можно собирать объекты.


public class Menu {
    private final String soup; //required
    private final String second; //required
    
    private final String salad; //optional
    private final String tea; //optional
    private final String desert; //optional
    private final String fruits; //optional
    
    public static class MenuBuilder {
        private final String soup; //required
        private final String second; //required
        
        private String salad; //optional
        private String tea; //optional
        private String desert; //optional
        private String fruits; //optional
        
        MenuBuilder(String soup, String second) {
            this.soup = soup;
            this.second = second;
        }
        
        public MenuBuilder setSalad(String salad) {
            this.salad = salad;
            return this;
        }
        
        public MenuBuilder setTea(String tea) {
            this.tea = tea;
            return this;
        }
        
        public MenuBuilder setDesert(String desert) {
            this.desert = desert;
            return this;
        }
        
        public MenuBuilder setFruits(String fruits) {
            this.fruits = fruits;
            return this;
        }
        
        public Menu build() {
            return new Menu(this);
        }
    }
    
    private Menu(MenuBuilder builder) {
        soup = builder.soup;
        second = builder.second;
        salad = builder.salad;
        tea = builder.tea;
        desert = builder.desert;
        fruits = builder.fruits;
    }
    
    public static void main(String[] args) {
        Menu menu = new Menu.MenuBuilder("soup", "second")
            .setDesert("desert")
            .setFruits("fruits")
            .setSalad("salad")
            .setTea("tea")
            .build();
    }
}

Комментариев нет:

Отправить комментарий