【问题标题】:Strategy or dessign pattern to restrict creation of objects限制对象创建的策略或设计模式
【发布时间】:2014-08-06 08:12:20
【问题描述】:

假设我已经实现了 Dog 类:

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

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

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

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

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

【问题讨论】:

    标签: java design-patterns restriction


    【解决方案1】:

    我会将Breed 和实际Dog 的概念分开。了解允许的Colours 是Breed 的责任,而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-class 就可以使用它了:

    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
    
    }
    

    【讨论】:

    • 是否可以在运行时生成枚举?我必须从外部文件中导入有关可用品种和颜色的信息。此文件可能会不时更改。
    猜你喜欢
    • 2011-06-21
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2020-08-11
    相关资源
    最近更新 更多