2012-03-13 65 views
0

所以我有一個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

ABCFramework應該放在哪一層?查看,控制器等 – Woot4Moo 2012-03-13 14:17:47

+0

是的,這是一個基本的工廠模式,(重命名PageItem IPageItem會使它在大多數其他開發人員的眼睛更清晰)。爲了獲得下一個抽象層次,你應該看看一個IOC(反轉控制)模式實現,例如依賴注入。 – 2012-03-13 14:20:57

+0

在我看來,工廠在這裏沒有必要,因爲對象的構造相當簡單。 – 2012-03-13 14:17:02

回答

0

這取決於。有一個工廠有兩個主要原因:

  1. 對象設置很複雜。

  2. 您需要將您的應用程序的兩個獨立的部分之間的轉換。

在第一種情況下,工廠知道如何初始化一個對象,以便它可以立即使用。在第二種情況下,工廠就像一個適配器/轉換器(將一個對象類型轉換爲另一個)。

重用並不重要 - 在這種情況下,分離的擔憂。

+0

好的謝謝你的答案。我會離開它,比這:) – mrmuggles 2012-03-13 14:25:42

0

由於代碼調用工廠非常熟悉使用ABCPage一個工廠不提供多大的改善在調用構造函數本身。

凡工廠模式進入它自己是要在其中創建不同的子類,在這種情況下,PageItem,更多的是基於的參數比它們的類型的值。

例如如果你有這樣的事情:

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

而且PageItem你想返回由值之一(或值的組合)在數據

0

確定。如果你想讓它可重複使用的子類對於其他類型的PageItems,你將需要一個abstract factory。您的PageItemFactory將是AbstractPageItemFactory的一個實例,可以重複使用。這將允許您通過傳遞AbstractPageItemFactory的不同實例來更改方法使用的工廠類型。