如何为每个键/上下文/客户创建一个对象的单个实例?

时间:2012-12-11 21:55:00

标签: java design-patterns

我需要创建一个类,其每个键/ context / customer只存在一次实例。

我不知道我是否在思考问题和解决方案。任何建议或指导都将非常有帮助。 下面显示的是我想要做的简化示例。

为了保持帖子小,我删除了界面和抽象类。您应该能够编译此代码

我正在使用初始化时间来查找两个实例是相同还是不同。

基类

package com.SomeCompany2.ps.stackOverflow.question;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CheckClass{
    protected String intializationTime;

    public CheckClass(){
        setIntializationTime();
    }

    private void setIntializationTime() {
        final Date date = new Date();
        final DateFormat formatter = new SimpleDateFormat("HH:mm:ss:SSS");
        this.intializationTime = formatter.format(date);
    }

    public String getIntializationTime(){
        return this.intializationTime;
    }

    public boolean isMatch(){
        return false;
    }
}

类工厂,确保只存在一个实例。

package com.SomeCompany2.ps.stackOverflow.question;

import java.util.HashMap;
import java.util.Map;

public class CheckClassFactory{
    private CheckClassFactory(){}

    private static class CheckClassHolder   {
        private static final Map<String, CheckClass> mapping    = new HashMap<String, CheckClass>();

        private static CheckClass getInstance(final String key){
            if (!mapping.containsKey(key)){
                final CheckClass INSTANCE   = new CheckClass();
                mapping.put(key, INSTANCE);
            }
            return mapping.get(key);
        }

        public static void removeInstance(final String key){
            mapping.remove(key);
        }
    }

    public static CheckClass getInstance(final String key){
        return CheckClassHolder.getInstance(key);
    }

    public static void removeInstance(final String key){
        CheckClassHolder.removeInstance(key);
    }
}

我想到的一个问题是,当调用“removeInstance”并从地图中删除实例时,实例是否会被销毁?

还有更简单的方法或知道模式来完成这项任务吗?

1 个答案:

答案 0 :(得分:1)

有几种方法可以改进。

您的工厂维护[key,instance]的映射应该已经足够了,但如果您有多个线程,您可能希望将mapping访问包装在同步块中。

您不应该initializationTime查看它们是否不同 - 因为每个键只有一个实例,您可以使用默认的equals(或==),因为施工由工厂控制。