2011-01-25 12 views
13

私はファサードのポイントを本当に理解していません。Java EEのファサードのポイントは何ですか?

public abstract class AbstractFacade<T> { 

    private Class<T> entityClass; 

    public AbstractFacade(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 

    protected abstract EntityManager getEntityManager(); 

    public void create(T entity) { 
     getEntityManager().persist(entity); 
    } 

    public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 

    public void remove(T entity) { 
     getEntityManager().remove(getEntityManager().merge(entity)); 
    } 

    public T find(Object id) { 
     return getEntityManager().find(entityClass, id); 
    } 

    public List<T> findAll() { 
     CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     return getEntityManager().createQuery(cq).getResultList(); 
    } 

    public List<T> findRange(int[] range) { 
     CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     Query q = getEntityManager().createQuery(cq); 
     q.setMaxResults(range[1] - range[0]); 
     q.setFirstResult(range[0]); 
     return q.getResultList(); 
    } 

    public int count() { 
     CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     Root<T> rt = cq.from(entityClass); 
     cq.select(getEntityManager().getCriteriaBuilder().count(rt)); 
     Query q = getEntityManager().createQuery(cq); 
     return ((Long) q.getSingleResult()).intValue(); 
    } 
} 

私はこのコードを持っていて、私はこのようなEJBを持っています。

@Stateless 
public class WrapSpecFacade extends AbstractFacade<WrapSpec> { 
    @PersistenceContext 
    private EntityManager em; 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

    public WrapSpecFacade() { 
     super(WrapSpec.class); 
    } 

} 

この点は何ですか?なぜこれをファサードと呼びますか?私にとっては、それは類似の機能をグループ化する単なる抽象クラスです。ありがとう。

答えて

16

ファサードはデザインパターンです。パターン、ソフトウェアパターンは、コードを整理して特定の構造を提供するための一連のルールです。パターンを使用することによっていくつかの目標に達することができます。 アプリケーションの設計時にデザインパターンが使用されます。

ファサードパターンを使用すると、プログラマはオブジェクトが他のオブジェクトを使用するための簡単なインタフェースを作成できます。 非常に複雑なクラスのグループで作業し、すべて独自のインターフェイスを実装することを検討してください。 さて、多くの機能のうち一部の機能だけを公開するためのインターフェースを提供したいとします。 これにより、コードのシンプルさ、柔軟性、統合性、疎結合性を実現します。

例では、ファサードは多くのアクタ間のカップリングを管理するために使用されます。それは設計問題です。多くのコンポーネントが相互に作用し合うと、それらのコンポーネントを維持することが難しくなります(コードのメンテナンスを意味します)。ファサードを使用すると、疎結合に達することができます。これは、プログラマが常に到達すべき目標です。

次のことを考えてみましょう:

public class MyClass1 implements Interface1 { 
    public void call1() {} 
    public call call2() {} 
} 

public class MyClass2 implements Interface2 { 
    public void call3() {} 
    public void call4() {} 
} 

public class MyClass { 
    private MyClass1 a; 
    private MyClass2 b; 
    //calling methods call1 call2 call3 and call4 in other methods of this class 
    ... 
    ... 
} 

あなたがインターフェイスを変更しないで... call1またはcall2で使用されるクラスのビジネス・ロジックを変更しなければならなかった場合、あなたはすべてのこれらのクラスを変更する必要はありません、最初の2つのクラスのインターフェイスメソッドの1つで使用されるメソッド内のクラスだけです。

ファサードでは、このメカニズムを改善できます。

申し訳ありませんが、それほど素晴らしいとは思いません。デザインパターンはソフトウェア業界で頻繁に使用されており、大きなプロジェクトで作業する場合は非常に便利です。 あなたのプロジェクトはそれほど大きくないかもしれませんが、それは真実かもしれませんが、Java EEはビジネスやエンタープライズレベルのアプリケーションプログラミングを支援することを目指しています。そのため、ファサードパターンがデフォルトで使用されることがあります(一部のIDEでもそれを使用しています)。

7

通常、このパターンは、インターフェイスを提示している基本クラスの実装を非表示にしたり、複雑な可能性のある実装を単純化したりするために使用されます。

ファサードは外界にシンプルなインターフェースを提供しますが、フードの下では他のクラスのインスタンスを作成したり、トランザクションを管理したり、ファイルやTCP/IP接続を処理したりできます。簡略化されたインタフェース

6

あなたの特定の状況では、これは実際にファサードではありません。あなたはそのコードで基本的にDAO(データアクセスオブジェクト)を持っています。

DAOはDB操作のファサードと見ることができますが、これはその主な目的ではありません。主にDB内部を隠すつもりです。あなたの例では、基盤となるストレージシステムをXMLファイルやHBaseのようなキーストアに切り替える場合でも、その "Facade"で定義されているメソッドを使用することができ、クライアントコードで変更する必要はありません。

ファサードは、クライアントから隠される必要がある複雑なデザインを扱います。複雑なAPIと複雑なフローを公開する代わりに(このサービスから取得し、それをこのコンバーターに渡し、結果を取得してこれを検証してからこの別のサービスに送信する)、すべてをFacadeにカプセル化して単純なメソッドをクライアントに公開します。このようにして、APIの使用が非常に簡単であることに加えて、クライアントのコードを破ることなく、基盤となる(複雑な)実装を自由に変更することができます。