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

我认为您正在寻找轻量级模式。享元是一种通过与其他类似对象共享尽可能多的数据来最小化内存使用的对象;当简单的重复表示将使用不可接受的内存量时,这是一种使用大量对象的方法。

对于享元模式,对象应该是不可变的,以便可以在考虑线程安全的情况下共享它。对于不可变对象,线程安全是免费的。您可以执行以下操作。您可以将PriceCategory其视为一个enum或一些不可变的对象。由于enum本质上是不可变的,因此我们可以拥有最小的对象创建足迹并且也是安全的。

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 回答