2012-03-13 7 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はどの層に入っていますか? View、Controllerなど – Woot4Moo

+0

これは基本的なFactoryパターンです(PageItem IPageItemの名前を変更すると、他のほとんどの開発者の目では少し明確になります)。次のレベルの抽象化を得るためには、Dependency InjectionなどのIOC(Inversion of Control)パターン実装を見てください。 –

+0

私の意見では、オブジェクトの構築はかなり簡単なので、ここでは工場は必要ありません。 –

答えて

0

工場を持つ主な理由は2つあります。

  1. オブジェクトの設定は複雑です。

  2. アプリケーションの2つの独立した部分を翻訳する必要があります。

最初のケースでは、ファクトリは、オブジェクトを初期化してすぐに使用できるようにする方法を知っています。後者の場合、ファクトリはアダプタ/コンバータ(1つのオブジェクト型を別のものに変換する)のように動作します。

再利用は関係ありません。この場合は、懸案事項が分かれます。

+0

答えに感謝します。私はそれよりもこれのように:) – mrmuggles

0

ファクトリを使用するコードは、ABCPageをよく知っているため、ファクトリを使用してもコンストラクタ自体を呼び出すよりも大幅な改善はありません。

ここで、ファクトリパターンは、その型よりも引数の値に基づいて、この場合はPageItemの異なるサブクラスを作成する場所です。

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

そして、あなたはあなたはそれが利用可能な再作成したい場合は、データ

0

の中の値のいずれか(または値の組み合わせ)により決定された返却したかったPageItemのサブクラス:あなたのような何かを持っていた場合他のタイプのPageItemsの場合は、abstract factoryが必要です。 PageItemFactoryは、再利用できるAbstractPageItemFactoryのインスタンスになります。これにより、AbstractPageItemFactoryの別のインスタンスを渡すことによって、メソッドによって使用されるファクトリのタイプを変更することができます。

関連する問題