Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 工厂方法模式-什么时候';创造者';类实现工厂方法?_Java_Factory Method - Fatal编程技术网

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-我确信它们是相同的
工厂方法模式
,所以我想我误解了,尽管第二个示例取自破解第六版的《编码》一书,所以这对我来说很奇怪。。。