Java 工厂方法模式-什么时候';创造者';类实现工厂方法?
在Java 工厂方法模式-什么时候';创造者';类实现工厂方法?,java,factory-method,Java,Factory Method,在工厂方法模式中,有2个潜在客户实施(如果我错了,请纠正我): 当Creator类是抽象的并且没有为工厂方法提供实现时: public abstract class CasinoGameCreator { public void playGame() { ICasinoGameType gameType = createGame(); gameType.play(); } public abstract ICasinoGameType createGame(); publi
工厂方法
模式中,有2个潜在客户实施(如果我错了,请纠正我):
当Creator
类是抽象的
并且没有为工厂方法提供实现时
:
public abstract class CasinoGameCreator {
public void playGame() {
ICasinoGameType gameType = createGame();
gameType.play();
}
public abstract ICasinoGameType createGame();
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;
}
}
}
或,我们可以让创建者
类成为一个具体的类,为工厂方法
提供实现:
public abstract class CasinoGameCreator {
public void playGame() {
ICasinoGameType gameType = createGame();
gameType.play();
}
public abstract ICasinoGameType createGame();
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遵循以下步骤。这意味着:它可以扩展(因为不同的子类可以实现创建游戏的不同方式);但是它是关闭的,可以修改-playGame()的行为是固定的。嗯,不是,;但是如果你使用这种模式,你真的会想让playGame()成为最终版本。如果您有这样一个抽象类和一个实现X;和抽象方法Y(在另一方法X中使用);因此,允许子类更改X没有多大意义
当你真正确定不同类型的游戏时,选项2很有用;意思:这个枚举改变的可能性很小。考虑到赌场游戏的理念;我非常怀疑这在这里是真的。也许你可以每隔一天添加一个新游戏。然后,你必须转向每一个切换游戏类型的地方并修改代码
因此,考虑到这些想法,选项1将是第一选择-因为您可以通过创建creator类的新子类简单地添加一个新的游戏类型。这意味着:您可以添加新游戏,而无需触摸负责其他游戏的代码
当然:如果您选择一个不同的示例,则要求可能不同,然后选项2可能会有某些好处。我相信您指的是和。关于你的问题的可能答案,所以你的第二个例子不是a,而是a。你真的打算比较两种不同的模式吗?或者你误解了工厂方法模式的两个选项是什么?@Andreas-我确信它们是相同的
工厂方法模式
,所以我想我误解了,尽管第二个示例取自破解第六版的《编码》一书,所以这对我来说很奇怪。。。