首页 > 解决方案 > 结合工厂方法和单例设计模式

问题描述

我目前正在实现一个游戏,其中有不同类型的地图。作为所有映射,它们自然共享某些属性和方法,因此创建了一个抽象类Map,然后由映射子类,例如SafeMap, HazardousMap,WeirdMap等。

为了方便以后添加更多地图,使用了工厂方法设计模式。所以程序包含一个MapCreator类,其代码如下所示:

public class MapCreator{
    public Map createMap(char mapType){
        switch(mapType){
            case 'S':
                return new SafeMap();
            case 'H':
                return new HazardousMap();
            case 'W':
                return new WeirdMap();
            default:
                return null;
        }
    }
}

现在我还想强制只存在一个 Map 实例(不管选择的子类)。我已经读过,解决此问题的最佳方法是部署单例设计模式,其中静态实例在类中私有声明,并且构造函数也设为私有。但是我不知道如何结合工厂方法设计模式来完成,因为我们有多个子类并且getInstance()必须在一个具体的类中。

我感谢任何帮助。


注意:我看过一些类似的问题,但我认为对这些问题的回答与我的情况无关。

标签: javadesign-patternssingletonfactory-pattern

解决方案


最简单的方法是使用单个静态字段,如果已创建地图,则返回该值。

代码未经测试,但我认为这个概念很简单:

public class MapCreator{
    private static Map theOnlyMap;
    public synchronized Map createMap(char mapType){
        if( theOnlyMap != null ) return theOnlyMap;
        switch(mapType){
            case 'S':
                theOnlyMap = new SafeMap();
                 break;
            case 'H':
                theOnlyMap =  new HazardousMap();
                break;
            case 'W':
                theOnlyMap = new WeirdMap();
                break;
        }
        return theOnlyMap;
    }
}

推荐阅读