JavaTM RMI にファクトリパターンを適用する

「ファクトリ」とは何か。また、それを使う理由は何か。ここでファクトリとは、「Design Patterns, Elements of Reusable Object-Oriented Software」で紹介されている「ファクトリ」設計パターンの 1 つを実装したソフトウェアを指します。一般にファクトリ実装は、1 つのオブジェクトに他のオブジェクトの作成やアクセスを管理させる必要がある場合に便利です。JavaTM Remote Method Invocation (Java RMI) でファクトリを使うことにより、Java RMI レジストリに登録するオブジェクトの数を減らすことができます。

実社会でのファクトリの例

銀行

銀行で預金するとき、顧客は「金庫まで歩いていって自分の名前の引き出しを開き、お金を入れて引き出しを閉じ、立ち去る」ことはしません。最初に口座を開くときにはどうするでしょうか。銀行に行って担当者と話し、書類に記入します。引き換えに通帳やカードを受け取ります。 そのあとは、この通帳やカードを使って口座にアクセスすることができます。

銀行の担当者はファクトリの一例です。その担当者または担当者の役割をする ATM (現金自動振り込み/支払い機) が、個々の口座の作成や口座へのアクセスを管理します。

図書館

図書館の棚から本、CD、ビデオテープなどを借りる場合について考えてみましょう。本などを借りる場合には、その前にまず、図書館の職員に利用者カードを発行してもらう必要があります。この場合は、図書館の職員が新規の利用者カードのインスタンスを管理するので、図書館の職員を利用者カードのファクトリと考えることができます。

利用者カードを受け取ったからといって、図書館に入って借りたい本をそのまま持ち出すことはできません。本を持って図書館から出るには、本の貸し出し手続きをしなければなりません。つまり、利用者カードを職員に見せます。 職員はそのカードを使って図書館のデータベースにアクセスし、その人から返却の遅れている本がないか調べ、その本がその人に貸し出し中であることを登録します。この場合は、職員が本への利用者のアクセスを管理するので、職員を本のファクトリと考えることができます。

Java RMI でのファクトリの働き

ほかの Java RMI プログラムと同様に、サーバ、クライアント、rmiregistry の 3 つの基本的要素があります。サーバは、1 つまたは複数のリモートオブジェクトを作成します (各リモートオブジェクトはリモートインタフェースを実装する)。 クライアントは、ネームサーバ (rmiregistry) にアクセスしてリモートオブジェクトの 1 つへの参照を取得します。rmiregistry は、クライアントからサーバへの最初の連絡を簡単にします。

以下の図と手順では、次のことを前提とします。

下に挙げた 6 つの操作を図示する

  1. FactoryImpl は rmiregistry に登録する (または登録される)
  2. クライアントは Factory への参照を要求する
  3. rmiregistry は FactoryImpl へのリモート参照を返す
  4. クライアントは FactoryImpl 上のリモートメソッドを呼び出して、ProductImpl へのリモート参照を取得する
  5. FactoryImpl は、既存の ProductImpl へのリモート参照、またはクライアントの要求に基づき新しく作成した ProductImpl へのリモート参照を返す
  6. クライアントは ProductImpl 上のリモートメソッドを呼び出す

銀行と図書館の例を Java RMI でどのように実装するか

銀行

コードでは、AccountManager (担当行員) はリモートインタフェースになり、リモートメソッドを 1 つ以上持ちます。これらのメソッドは、Account (口座) インタフェースを実装したオブジェクトを返します。Account は、口座のインスタンスに対して実行できるすべての操作 (預け入れや引き出し、残高照会、記帳など) を宣言したインタフェースになります。

Java RMI では、AccountManager 実装のインスタンスだけが Java RMI レジストリに登録されます。AccountManager 実装は、預金口座と同様に Account 実装へのリモート参照 (または直列化されたインスタンス) を返すファクトリです。

図書館

図書館の例では、Librarian (職員) はリモートインタフェースになり、LibraryCard (利用者カード) インタフェースを実装したオブジェクトを返すメソッドを 1 つ以上持ちます。さらに Librarian インタフェースには本や CD やビデオテープへのアクセスを許可するメソッドがあり、本や CD やビデオテープには Loanable (貸し出し可能) インタフェースが実装されています。

Java RMI では、Librarian 実装のインスタンスだけが Java RMI レジストリに登録されます。Librarian 実装は、LibraryCard 実装および Loanable オブジェクト実装へのリモート参照 (または直列化されたインスタンス) を返すファクトリです。

ここで示した銀行と図書館の例は完全なものではありませんが、Java RMI のファクトリパターンを理解する上では役に立ちます。

Copyright © 2004 Sun Microsystems, Inc.All Rights Reserved.
コメントの送付先:rmi-comments@java.sun.com
Sun