在这里使用Factory模式有意义吗?

时间:2012-03-13 14:10:09

标签: java design-patterns

所以我有一个我想在其他地方重用的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 :(得分:0)

这取决于。有一个工厂有两个主要原因:

  1. 对象设置很复杂。

  2. 您需要在应用程序的两个独立部分之间进行翻译。

  3. 在第一种情况下,工厂知道如何初始化对象,以便可以立即使用它。在第二种情况下,工厂的工作方式类似于适配器/转换器(将一种对象类型转换为另一种对象类型)。

    重用并不重要 - 在这种情况下,它将问题分开。

答案 1 :(得分:0)

由于调用工厂的代码非常熟悉使用Factory的ABCPage,因此调用构造函数本身并没有太大的改进。

工厂模式进入它自己的位置是你想要创建不同的子类,在本例中是PageItem,更多地基于参数的值而不是它们的类型。

e.g。如果你有类似的东西:

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

您想要返回的PageItem的子类由数据中的一个值(或值的组合)确定

答案 2 :(得分:0)

如果您想让它可以重复用于其他类型的PageItem,那么您需要abstract factory。您的PageItemFactory将是AbstractPageItemFactory的一个实例,可以重复使用。这将允许您通过传入AbstractPageItemFactory的不同实例来更改方法使用的工厂类型。