假设我要建立一个不变的Yahtzee计分卡类:

public final class Scorecard {

    private Map<Category, Integer> scorecard = new HashMap<Category, Integer>();

    public Scorecard() {
        // Instantiates a new empty scorecard
    }

    private Scorecard(Map<Category, Integer> scorecard) {
        this.scorecard = scorecard;
    }

    public Scorecard withScore(Category category, int[] roll) {
        newScorecard = new HashMap<Category, Integer>(scorecard); // Pretend that this is a deep-copy
        newScorecard.put(category, calculateScoreFromRoll(roll));
        return new Scorecard(newScorecard);
    }

    public int getScore(Category category) {
        return scorecard.get(category);
    }

}

基本上我不想公开类的内部。如果我没有私有构造函数,那么我将需要使用一个带有Map参数的公共构造函数,就像私有变量一样(而且我也可能会丢失withScore()方法),以便允许评分。但这是执行工厂方法的有效方法吗?

最佳答案

一个非常常见的好模式是拥有所有私有构造函数和公共静态工厂方法:

public class MyClass {
    private MyClass() {}
    public static MyClass fromA(A foo) {
        MyClass o = new MyClass();
        o.field = bar; // etc
        return o;
    }
    public static MyClass fromB(B foo) {
        MyClass o = new MyClass();
        o.field = bar; // etc
        return o;
    }
}

注意:这允许使用具有相同参数类型的不同工厂方法,而构造函数不允许这样做。

09-27 21:30