首页 新闻 会员 周边

求问一个单例+工厂模式的实现(java)

1
悬赏园豆:40 [已关闭问题] 关闭于 2013-07-29 08:51

是这样的,我有一个类,不同的参数只需要一个实例,可能有1000多个参数,但每次程序运行时候可能只需要10几个实例而已(单例就可以)。

所以我想单例用懒汉的模式去实现,需要的时候才实例化,否则实例化1000多个太浪费。现在的问题是,怎么写一个工厂去实例化单例的对象,总不能写1000多个if语句判断每个参数对应的实例有没有初始化吧。我不想用synchronized方法,这样多线程同步会消耗太多性能。

问题补充:

如果不加单例的话这样就可以

public class Factory{

   public static MyClass create(String arg){

    return new MyClass(arg);

  }

}

现在问题就是参数太多了单例怎么实现

第8感超人的主页 第8感超人 | 初学一级 | 园豆:88
提问于:2013-06-18 11:16
< >
分享
所有回答(3)
0

多线程不加锁.?

应该有一个字典集合,来存储可能被创建的这1000个对象,

然后可以不用if直接用字典集合来检索是否创建了这个对象就可以了.

只会造轮子 | 园豆:2274 (老鸟四级) | 2013-06-18 12:17

那访问字典还是要加锁吧

支持(0) 反对(0) 第8感超人 | 园豆:88 (初学一级) | 2013-06-18 12:43

加锁的话每次都得加 但是初始化一次实际上就不用再加了

支持(0) 反对(0) 第8感超人 | 园豆:88 (初学一级) | 2013-06-18 12:43

@第8感超人: 你可以加读写锁,

不知道java有没有ReaderWriterLock?

支持(0) 反对(0) 只会造轮子 | 园豆:2274 (老鸟四级) | 2013-06-18 14:44
0

创建一个hashmap用来存放单例。key是参数,value是单例。

public class Factory{

  //定义map

   public static MyClass create(String arg){

   //如果map.get(arg)存在,返回单例。

   //否则,创建单例,并加到map中。

  }

}

按你所说,map最后也就十多个元素。

在大地画满窗子 | 园豆:102 (初学一级) | 2013-06-18 18:03

hashmap不是线程安全的

支持(0) 反对(0) 第8感超人 | 园豆:88 (初学一级) | 2013-06-18 18:53

@第8感超人: 那用线程安全的。

Map m = Collections.synchronizedMap(new HashMap(...));

hashTable

支持(0) 反对(0) 在大地画满窗子 | 园豆:102 (初学一级) | 2013-06-18 21:09

@第8感超人: 楼主,这个方案有什么欠妥的地方么?

是怕map不断增大,无释放,消耗空间么?

支持(0) 反对(0) 在大地画满窗子 | 园豆:102 (初学一级) | 2013-06-20 10:38
0

用内部类的方式来做吧!

public class Singleton3 implements Serializable{
    private Singleton3(){}
    private static class SingletonHolder{
        private static Singleton3 instance = new Singleton3();
    }
    public static Singleton3 getInstance(){
        return SingletonHolder.instance;
    }
    //阻止生成新的实例
    public Object readResolve(){
        return SingletonHolder.instance;
    }
}

这样的话,当这个单例被加载时,不会初始化单例类,只有当getInstance方法被调用的时候,才会去加载SingletonHolder,从而才会去初始化 instance。并且,单例的加载是在内部类的加载的时候完成的,所以天生对线程友好,而且也不需要synchnoized关键字,可以说是兼具了延迟加载和线程的优点。

Marcos.W | 园豆:230 (菜鸟二级) | 2013-06-19 22:27

1000多个参数怎么实现?

支持(0) 反对(0) 第8感超人 | 园豆:88 (初学一级) | 2013-06-20 06:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册