演習問題5(ワゴン)


演習問題5-2 (Singleton)
タイムサービス
 番号おまけメッセージ
通常1無しいつもどおり
サービス210個で1個サービス中
大サービス35個で1個大サービス中

1個100円の商品がワゴン(Wagon クラス)に山積みになっています。

タイムサービス中は、購入した個数によって1個おまけされます。

サービス中は10個で1個、大サービス中は5個で1個、おまけとして余分に買えるわけです。


演習問題5-1の解答例では、「通常」「サービス」「大サービス」のどれかが選ばれるたびに、それらのクラスを new によって生成していました。しかし、同じタイムサービスのインスタンスであれば、何度も生成する必要はありません。生成するたびに、先に生成したインスタンスが無駄になってしまうからです。

そこで、タイムサービスの各クラスのインスタンスは一つだけに制限し、それを再利用するようにしなさい、また、new によってインスタンスを生成できないようにしなさい。


ただし、演習問題5-1で作成した各クラスを改修、継承して(改修後も演習問題5-1も動作するように)実現しなさい。


実行結果
1. いつもどおり
2. サービス
3. 大サービス
番号>1
いつもどおりなので、500円で5個買えた。
いつもどおりなので、1000円で10個買えた。
番号>2
サービス中なので、500円で5個買えた。
サービス中なので、1000円で11個買えた。
番号>3
大サービス中なので、500円で6個買えた。
大サービス中なので、1000円で12個買えた。
番号>


コード

Enshu502.java
public class Enshu502 { private Wagon wagon = new Wagon(100); // ワゴン(100円) public static void main(String[] args) { Enshu502 en = new Enshu502(); en.exec(); } public void exec() { BufferedReader r = new BufferedReader(new InputStreamReader(System.in), 1); System.out.println("1. いつもどおり"); System.out.println("2. サービス"); System.out.println("3. 大サービス"); String no; int n; while (true) { System.out.print("番号>"); try { no = r.readLine(); n = Integer.parseInt(no); } catch(Exception e) { return; } if (n == 1) // 通常 wagon.setState(SingleOrdinary.getInstance()); else if (n == 2) // サービス wagon.setState(SingleSpecial.getInstance()); else if (n == 3) // 大サービス wagon.setState(SingleLimitedSpecial.getInstance()); else return; buy(500); // 500円 buy(1000); // 1000円 } } private void buy(int payment) { // payment:支払金額 int bought = wagon.buy(payment); // bought :購入できた個数 System.out.println(wagon.getMessage() + "なので、" + payment + "円で" + bought + "個買えた。"); } }






演習問題5-2 (Singleton)