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;
}
}
}
是否有任何强烈的偏好何时使用每个实现?如果有,在一般情况下我们更倾向于使用第一种方法而不是第二种方法?
答案 0 :(得分:1)
选项1跟随Open/closed principle。这意味着:它对扩展是开放的(因为不同的子类可以实现创建游戏的不同方式);但它被修改关闭 - playGame()的行为是固定的。嗯,事实并非如此;但是如果你使用这个模式,你真的会想让playGame()成为最终的。如果你有一个带有实现X的抽象类;和抽象方法Y(在另一个方法X中使用);比允许子类更改X没有多大意义。
当您确定不同类型的游戏时,选项2很有用;意思是:这个枚举永远不会改变的机会很小。考虑到赌场游戏的想法;我非常怀疑这里的确如此。可能你每隔一天就可以添加一个新游戏。然后,您必须转到每个切换GameType的地方并调整该代码。
因此,考虑到这些想法,选项1将是第一选择 - 因为您可以通过创建创建者类的新子类来简单地添加新游戏类型。这意味着:您可以在不触及负责其他游戏的代码的情况下添加新游戏。
当然:如果你选择一个不同的例子,要求可能会有所不同,那么选项2可能会有一些好处。