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

「ファクトリ」とはどのようなもので、なぜ使うのでしょうか。ここでファクトリとは、「ファクトリ」設計パターンの1つを実装したソフトウェアを指します。一般にファクトリ実装は、1つのオブジェクトで他のオブジェクトの作成またはアクセス(あるいはその両方)を管理する必要がある場合に便利です。Java Remote Method Invocation (Java RMI)でファクトリを使うことにより、Java RMIレジストリに登録するオブジェクトの数を減らすことができます。

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

銀行

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

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

図書館

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

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

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

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

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

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

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

 

銀行と図書館の例を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 © 1993, 2020, Oracle and/or its affiliates. All rights reserved.