実際のコードを簡略化して、要点を示す最小の例にしました。セッター/ゲッター等の不足すみません。
顧客が順番に閲覧するWebページがいくつかあると想像してください。ここでの使用例は次のとおりです。-
- ユーザーは必要な本を選択します
- ユーザーは、郵便または電子メールで送信するかどうか、および関連する詳細を選択します
- システムは注文を履行します
この質問は、2つの配信方法に焦点を当てています。これは次のようにモデル化されます。
interface DeliveryDetails
{
// Implementations of this have nothing in common other than that they
// fulfil the same logical role.
}
class EmailDeliveryDetails implements DeliveryDetails
{
String emailAddress; // It really has a constructor and getter, I promise.
}
class PostalDeliveryDetails implements DeliveryDetails
{
String streetAddress;
String Country;
}
ここで、ページを閲覧するときにユーザーが入力した情報を表すために、次のクラスがあります。
class PurchaseData
{
String title;
DeliveryDetails deliveryDetails;
}
ユーザーがWebページをステップスルーすると、情報はのインスタンスに保存されますPurchaseData
。ユーザーがページに戻ると、以前に入力した内容を表示できます。ユーザーが確認し、本を配達するときが来たら、またはdeliveryDetails
のインスタンスを参照します。PostalDeliveryDetails
EmailDeliveryDetails
結論として、ユーザーが自分の情報を確認すると、次のようになります。
// Some code in a factory
if ( purchaseData.deliveryDetails instanceof EmailDelivery )
{
// construct a EmailDeliveryService( purchaseData, SMTP details, etc ... )
}
if ( purchaseData.deliveryDetails instanceof PostalDelivery )
{
// construct a PostalDeliveryService( purchaseData, etc ... )
}
}
Delivery
インターフェイスにメソッドがないのは困ります。
これは、電子メールと郵便配達の違いによって強制されます。
DeliveryDetails.deliver()
実装がSMTPサーバーアドレスのようなものを静的に取得することを強制するので、それは良い方法ではないと思います。これは懸念を混乱させます(配管とユーザーが入力した情報)。
任意のタイプのものを格納する必要がある場合は、ジェネリックスが役立ちます。PurchaseData<T extends Delivery>
PurchaseDataインスタンスの作成時に配信タイプが不明であるため、ジェネリック()を使用することはできません。とにかく、これは工場では役に立ちません。
この空のインターフェースは大丈夫ですか?このコードを設計するためのより良い方法はありますか?