所以我有一个我想在其他地方重用的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特定参数?
答案 0 :(得分:0)
这取决于。有一个工厂有两个主要原因:
对象设置很复杂。
您需要在应用程序的两个独立部分之间进行翻译。
在第一种情况下,工厂知道如何初始化对象,以便可以立即使用它。在第二种情况下,工厂的工作方式类似于适配器/转换器(将一种对象类型转换为另一种对象类型)。
重用并不重要 - 在这种情况下,它将问题分开。
答案 1 :(得分:0)
由于调用工厂的代码非常熟悉使用Factory的ABCPage,因此调用构造函数本身并没有太大的改进。
工厂模式进入它自己的位置是你想要创建不同的子类,在本例中是PageItem,更多地基于参数的值而不是它们的类型。
e.g。如果你有类似的东西:
PageItem pi = PageItemFactory.
createPageItem(Map<String, Object> data);
您想要返回的PageItem的子类由数据中的一个值(或值的组合)确定
答案 2 :(得分:0)
如果您想让它可以重复用于其他类型的PageItem,那么您需要abstract factory。您的PageItemFactory将是AbstractPageItemFactory的一个实例,可以重复使用。这将允许您通过传入AbstractPageItemFactory的不同实例来更改方法使用的工厂类型。