TO: taglib我的程序里有很多Listener 譬如: final class OKButtonEvent implements ActionListener, MouseListener, MouseMotionListener, FocusListener, MouseWheelListener {...}是不是应该做成Singleton呢?我也想到了类似你说的方法就是用一个Collections 不过我觉得还是不像继承来的直观和简单,网上有C++的代码,不过是有Template来参与的 不知道Java有什么好的办法?
问题解决:Singleton模式的要点: 1、某个类只能有一个实例 2、必须自行创建这个实例 3、必须向整个系统提供这个实例 Singleton模式的实现方法 1、饿汉式singleton public class EagerSingleton { private static final EagerSingleton m_instance = new Eagersingleton(); private Eagersingleton(){}public static EagerSingleton getInstance() { return m_instance; }}2、懒汉式singleton public class LazySingleton { private static LazySingleton m_instance = null; private LazySingleton(){}; synchronized public static LazySingleton getInstance() { if( m_instance == null ) { m_instance = new LazySingleton(); } return m_instance; } }3、登记式singleton import java.util.HashMap; public class RegSingleton { static private HashMap m_registry = new HashMap(); static { RegSingleton x = new regSingleton(); m_registry.put(x.getClass().getName(), x); } protect RegSingleton(){} static public RegSingleton getInstance(String name) { if(name == null ) { name = "RegSingleton"; } if(m_registry.get(name ) == null ) { m_registry.put(name, Class.forName(name).newInstance(); } catch(Exception e) { System.out.println("Error happened."); } return (RegSingleton)(m_registry.get(name)); } }三种Singleton模式的比较饿汉式 类被加载时就被实例化。 懒汉式 类加载时,不被实例化,在第一次引用时实例化。 饿汉式、懒汉式都不能被继承 而登记式可以被继承。
我固然可以为每一个类里加上这样的代码但继承不是就是为了提高代码的重利用性吗?
所以我把相同的部分做成了一个总基类,就是上面的代码。可是这个类不能被继承,所以我就提出了这样的问题。
http://martinfowler.com/eaaCatalog/repository.html
final class OKButtonEvent implements ActionListener,
MouseListener,
MouseMotionListener,
FocusListener,
MouseWheelListener {...}是不是应该做成Singleton呢?我也想到了类似你说的方法就是用一个Collections
不过我觉得还是不像继承来的直观和简单,网上有C++的代码,不过是有Template来参与的
不知道Java有什么好的办法?
1、某个类只能有一个实例
2、必须自行创建这个实例
3、必须向整个系统提供这个实例 Singleton模式的实现方法
1、饿汉式singleton
public class EagerSingleton
{
private static final EagerSingleton m_instance = new Eagersingleton();
private Eagersingleton(){}public static EagerSingleton getInstance()
{
return m_instance;
}}2、懒汉式singleton
public class LazySingleton
{
private static LazySingleton m_instance = null;
private LazySingleton(){};
synchronized public static LazySingleton getInstance()
{
if( m_instance == null )
{
m_instance = new LazySingleton();
}
return m_instance;
}
}3、登记式singleton
import java.util.HashMap;
public class RegSingleton
{
static private HashMap m_registry = new HashMap();
static
{
RegSingleton x = new regSingleton();
m_registry.put(x.getClass().getName(), x);
}
protect RegSingleton(){}
static public RegSingleton getInstance(String name)
{
if(name == null )
{
name = "RegSingleton";
}
if(m_registry.get(name ) == null )
{
m_registry.put(name, Class.forName(name).newInstance();
}
catch(Exception e)
{
System.out.println("Error happened.");
}
return (RegSingleton)(m_registry.get(name));
}
}三种Singleton模式的比较饿汉式 类被加载时就被实例化。
懒汉式 类加载时,不被实例化,在第一次引用时实例化。
饿汉式、懒汉式都不能被继承
而登记式可以被继承。