Имеет ли смысл использование шаблона Factory здесь? - PullRequest
0 голосов
/ 13 марта 2012

Итак, у меня есть объект PageItem, который я хочу использовать в другом месте. Я в рамках ABC.

Вот интерфейс PageItem:

public interface PageItem {

    public abstract String getUrl();

    public abstract boolean getIsCurrent();

    public abstract PageItem getParent();

    public abstract List<PageItem> getPChildren();

    public abstract void setParent(PageItem pageItem);

    public abstract void addChild(PageItem pageItems);

    public abstract boolean getHasSelectedChild();

}

Вот реализация:

public class PageItemImpl implements PageItem {

    private String title = "";
    private String url = "";
    private boolean isCurrent = false;
    private List<PageItem> children = new ArrayList<PageItem>();
    private PageItem parent = null;

    public String getUrl() {
        return url;
    }

    public boolean getIsCurrent() {
        return isCurrent;
    }

    public List<PageItem> getChildren() {
        return children;
    }


    public PageItem getParent() {
        return parent;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setIsCurrent(boolean isCurrent) {
        this.isCurrent = isCurrent;
    }

    public void setParent(PageItem parent) {
        this.parent = parent;
    }

    public void addChild(PageItem pageItem) {
       this.children.add(pageItem);        
    }

    public boolean getHasSelectedChild() {        
        return false;
    }

}

Вот фабрика:

public class PageItemFactory {

    public static PageItem getPageItem(ABCPage page,  ABCRequestParams params) throws ABCException {
        PageItemImpl pageItem = new PageItemABCImpl();
            pageItem.setTitle(page.getTitle());
            pageItem.setUrl(page.getUrl());  
            pageItem.setIsCurrent(params.getUrl().equals(page.getUrl());      
        return pageItem;
    }

}

Это я или нет смысла?

PageItemFactory не будет использоваться повторно в других местах, поскольку содержит ссылки на платформу ABC.

Должен ли я просто создать класс, который переопределяет PageItem, и использовать конструктор для определенных параметров ABC?

Ответы [ 3 ]

0 голосов
/ 13 марта 2012

Поскольку код, вызывающий фабрику, хорошо знаком с ABCPage, использование фабрики не дает особых улучшений по сравнению с вызовом самого конструктора.

Когда фабричный шаблон вступает в свои права, вы хотите создать различные подклассы, в данном случае, PageItem, основываясь больше на значениях аргументов, чем на их типах.

например. Если у вас было что-то вроде:

PageItem pi = PageItemFactory.
    createPageItem(Map<String, Object> data);

И подкласс PageItem, который вы хотели вернуть, определялся одним из значений (или комбинацией значений) в данных

0 голосов
/ 13 марта 2012

Если вы хотите использовать его повторно для других типов PageItems, вам понадобится абстрактная фабрика . Ваш PageItemFactory будет экземпляром AbstractPageItemFactory, который можно использовать повторно. Это позволит вам изменить тип фабрики, используемой методом, передав другой экземпляр AbstractPageItemFactory.

0 голосов
/ 13 марта 2012

Это зависит.Есть две основные причины иметь фабрику:

  1. Настройка объекта сложна.

  2. Вам необходимо выполнить перевод между двумя независимыми частями вашегоapplication.

В первом случае фабрика знает, как инициализировать объект, чтобы его можно было сразу использовать.Во втором случае фабрика работает как адаптер / преобразователь (преобразует один тип объекта в другой).

Повторное использование не имеет значения - в этом случае оно разделяет проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...