0

価格帯(低、中、高)があります。価格帯は、製品タイプによって異なります。

すべての価格帯を含むハンドラー クラスがあり、製品の価格帯を決​​定できます。

例えば:

商品A、価格:200、価格帯:50~300(中)

商品B, 価格:80, 価格帯:70-120 (高)

public class Handler {

        // static priceRangeMap for Price ranges

    public static void addPriceRange(PriceRange PriceRange){
        //add price ranges to the priceRangeMap
        //initialised when the application is started
    }

    public static String getClassificationForProduct(ProductData product) {
        //determine classification for a product
    }
}   

public class ProductData {

    public String getClassification() {
        return Handler.getClassificationForProduct(this);
    }
}

同じ範囲の商品がたくさんあるので、商品に価格範囲を保存したくありません。

それは醜い解決策ですか?

Handler.getClassificationForProduct(this);

より良い解決策はありますか?

4

1 に答える 1

1

Flyweight パターンを探していると思います。flyweight は、他の同様のオブジェクトとできるだけ多くのデータを共有することによって、メモリの使用を最小限に抑えるオブジェクトです。これは、単純な反復表現が容認できない量のメモリを使用する場合に、多数のオブジェクトを使用する方法です。

flyweight パターンのオブジェクトは、スレッド セーフを考慮して共有できるように、不変である必要があります。不変オブジェクトを使用すると、スレッドの安全性が解放されます。以下のようなことができます。または不変オブジェクトPriceCategoryとして取ることができます。enumAsenumは本質的に不変であるため、オブジェクト作成のフットプリントを最小限に抑え、安全にすることができます。

public class Handler {
public enum PriceCategory{
    LOW,MID, HIGH;
}
private static class Element{
    private int min;
    private int max;
    private Element(int min, int max){
        this.min=min;
        this.max=max;
    }
}
private static final Map<Element, PriceCategory> map = new HashMap<Element, PriceCategory>();
static{
    map.put(new Element(100, 200), Handler.PriceCategory.LOW);
    map.put(new Element(201, 300), Handler.PriceCategory.MID);
    map.put(new Element(301, 400), Handler.PriceCategory.HIGH);
}
public static String getClassificationForProduct(ProductData product) {
    //here just check for which range this product price is belonging and return that enum/immutable object
}
}
于 2013-09-22T23:30:16.447 に答える