I thought I'd make a factory of singletons during lunch
Expand|Select|Wrap|Line Numbers
- package factory;
- import java.util.*;
- class SingletonFactory {
- static Hashtable<Class, Boolean> classes = new Hashtable<Class, Boolean>();
- public static boolean forMe = false;
- private SingletonFactory() {
- }
- public static SingletonFactory getSingletonFactory() {
- SingletonFactory me = null;
- if(!forMe) {
- me = new SingletonFactory();
- forMe = true;
- }
- return me;
- }
- public static Object getSingleton(Object object) {
- Set keys = classes.keySet();
- Iterator iterator = keys.iterator();
- Object single = null;
- try {
- while( iterator.hasNext() ) {
- Class key = (Class)iterator.next();
- if( key == object.getClass() ) {
- if( !classes.get(key) ) {
- single = key.newInstance();
- classes.put(key, true);
- return single;
- }
- else {
- return null;
- }
- }
- }
- }
- catch(InstantiationException iE) {
- iE.printStackTrace();
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- return single;
- }
- public void addSingleton(Object object) {
- if(!classes.containsKey(object.getClass())) {
- classes.put(object.getClass(), false);
- }
- }
- public void finalize() {
- Set keys = classes.keySet();
- Iterator iterator = keys.iterator();
- while( iterator.hasNext() ) {
- Class key = (Class)iterator.next();
- classes.put(key, false);
- }
- }
- public static void main( String ... args ) {
- try {
- SingletonFactory factory = SingletonFactory.getSingletonFactory();
- System.out.println(a.getInstance(factory));
- System.out.println(a.getInstance(factory));
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
Expand|Select|Wrap|Line Numbers
- class a {
- a() {
- }
- public static a getInstance (SingletonFactory factory) {
- factory.addSingleton(new a());
- return (a)factory.getSingleton(new a());
- }
- }
Expand|Select|Wrap|Line Numbers
- new Singleton()
Can it be done or would this factory work only if everyone creates Singletons using getInstance?