演習問題7(商品情報)


演習問題7-1 (Flyweight)

データベースで商品情報を管理するための Databese クラスがあります。

ただし、Databese クラスはデータベースに対して何でもできてしまうので、Databese クラスを継承して、商品情報を取り出すためだけの Product クラスを作成しています。

ただし、今の Product クラスは、以前読み込んだ id の商品でも、毎回データベースから読み込んで Information クラスのインスタンスを生成しています。

しかし、これでは無駄なので、一度読み込んだ id の商品情報は保持し、次に同じ id が指定されたときには、Information クラスのインスタンスを毎回生成するのではなく、保持していた Information クラスのインスタンスを返すように変更してください。


Product クラス
  • 商品情報は保持する記憶領域を設定する。
  • get() メソッドで、指定された id の商品情報がすでに記憶領域にあれば、そのインスタンスを返す。
    まだなければ、データベースから情報を読み込み、インスタンスを生成し、記憶領域に保存する。

実行結果
(データベースへの接続)
(データベースからの読み込み)
製品名:製品名1、小売価格:200
(データベースからの読み込み)
製品名:製品名3、小売価格:600
製品名:製品名1、小売価格:200


コード

Enshu701.java
public class Enshu701 { public static void main(String[] args) { Product pd = new Product(); Information i1 = pd.get(1); System.out.println(i1); Information i2 = pd.get(3); System.out.println(i2); Information i3 = pd.get(1); System.out.println(i3); } }
Information.java
public class Information { private String name; // 製品名 private String district; // 産地 private int retailPrice; // 小売価格 private int purchasePrice; // 買い付け価格 private Vector<String> comment = null; // コメント(複数持てる) public Information() {} public Information(String n, String d, int p1, int p2) { name = n; district = d; retailPrice = p1; purchasePrice = p2; } public String toString() { StringBuffer s = new StringBuffer(); s.append("製品名:" + name + "、小売価格:" + retailPrice); if (comment != null) { if (!comment.isEmpty()) { s.append("、コメント:"); Iterator<String> it = comment.iterator(); while(it.hasNext()) s.append("[" + it.next() + "]"); } } return s.toString(); } public void setRetailPrice(int p) { retailPrice = p; } public void setComment(String c) { if (comment == null) comment = new Vector<String>(); comment.add(c); } }
Database.java
public class Database { public Database() { System.out.println("(データベースへの接続)"); } public Vector<String> selectProduct(int id) { System.out.println("(データベースからの読み込み)"); Vector<String> rec = new Vector<String>(); rec.add("製品名" + id); rec.add("産地" + id); rec.add("" + (id * 200)); // 小売価格 rec.add("" + (id * 100)); // 買い付け価格 return rec; } // その他いろいろできるメンバ関数 // : // : }
Product.java
public class Product extends Database { public Product() {} public Information get(int id) { Information info; Vector<String> s = selectProduct(id); int retailPrice = Integer.parseInt(s.get(2)); int purchasePrice = Integer.parseInt(s.get(3)); info = new Information(s.get(0), s.get(1), retailPrice, purchasePrice); return info; } }



演習問題7-1 (Flyweight)