工厂方法模式 - 'Creator'类应该何时实现Factory方法?

时间:2016-08-07 18:34:19

标签: java factory-method

Factory method模式中有 2线索实施(如果我错了,请纠正我):

Creator班级为abstract且未提供Factory method的实施时:

public abstract class CasinoGameCreator {

public void playGame() {
    ICasinoGameType gameType = createGame();
    gameType.play();
}

public abstract ICasinoGameType createGame();

,我们可以让Creator类成为为Factory method提供实现的具体类:

public class CasinoGame {

    public static CasinoGame createGame(GameType type) {
        if (type == GameType.BlackJack) {
            return new BlackJackGame();
        } else if (type == GameType.Poker) {
            return new PokerGame();
        } else {
            return null;
        }
    }
}

是否有任何强烈的偏好何时使用每个实现?如果有,在一般情况下我们更倾向于使用第一种方法而不是第二种方法?

1 个答案:

答案 0 :(得分:1)

选项1跟随Open/closed principle。这意味着:它对扩展是开放的(因为不同的子类可以实现创建游戏的不同方式);但它被修改关闭 - playGame()的行为是固定的。嗯,事实并非如此;但是如果你使用这个模式,你真的会想让playGame()成为最终的。如果你有一个带有实现X的抽象类;和抽象方法Y(在另一个方法X中使用);比允许子类更改X没有多大意义。

当您确定不同类型的游戏时,选项2很有用;意思是:这个枚举永远不会改变的机会很小。考虑到赌场游戏的想法;我非常怀疑这里的确如此。可能你每隔一天就可以添加一个新游戏。然后,您必须转到每个切换GameType的地方并调整该代码。

因此,考虑到这些想法,选项1将是第一选择 - 因为您可以通过创建创建者类的新子类来简单地添加新游戏类型。这意味着:您可以在不触及负责其他游戏的代码的情况下添加新游戏。

当然:如果你选择一个不同的例子,要求可能会有所不同,那么选项2可能会有一些好处。