限制对象创建的策略或设计模式

时间:2014-06-16 13:21:31

标签: java design-patterns restriction

假设我已经实现了课程Dog

public class Dog {
    private String breed;
    private Set<Colour> colours;
}

我还实现了一个函数来解析外部文件中有关可用狗的信息。之后,我收集了Dog个对象(例如杜宾犬,奇瓦瓦犬,哈士奇犬,金色)。在每只狗中,有品种的名称和每种品种的一组可用颜色(例如金色:黄色,肉桂粉,白色)。

此外,我想让用户创建House个对象。每个House可能包含Dog作为属性,但我想限制选项,因此用户必须只能创建我的集合中指定的狗。用户不能创建“约克郡”或“比格犬”,也不能创建绿色或蓝色的吉娃娃。

我应该使用哪种策略或dessign模式?

额外:我正在开发一个库(或框架,目前尚不清楚)。我的任务是提供一个API,用户可能需要的一系列功能。

1 个答案:

答案 0 :(得分:3)

我会将Breed和实际Dog的概念分开。了解允许的BreedColour的责任,而Dog的构造函数必须确保品种和颜色匹配。

您可以将Breed设为枚举,以确保只创建您认识的品种的狗:

public enum Breed {

    MYBREED(Color.BLACK, Color.GRAY),
    MYOTHERBREED(Color.GRAY);

    private List<Color> colors = new ArrayList<Color>();

    private Breed(Color...colors) {
        for(Color color: colors) {
            this.colors.add(color);
        }
    }

    public List<Color> getAllowedColors() {
        return colors;
    }

}

使用java枚举的缺点是您无法在运行时动态生成它们。在这种情况下,您必须通过一些手工解决方案来替换它,例如使用multiton pattern

然后Dog - 类可以使用它:

public class Dog {

    private Breed breed;
    private Color color;

    public Dog(Breed breed, Color color) {
        if(!breed.getAllowedColors().contains(color)) {
            throw new IllegalArgumentException(breed + " must not be of color " + color);
        }
        this.breed = breed;
        this.color = color;
    }

    public Breed getBreed() {
        return breed;
    }

    public Color getColor() {
        return color;
    }

    // No setters for breed and color because they cannot change during a dog's lifetime

      //... some more things a dog can do

}