From: Egon W. <e.w...@sc...> - 2005-09-28 09:28:59
|
On Wednesday 28 September 2005 10:52 am, Nina Jeliazkova wrote: > BTW, what are the advantages of the singleton ChemObjectBuilder compared to > a single static method somewhere, which can create any object given its > class name? (I can think of one - it only calls a constructor without any > parameters). When you have classes with static methods, you still need to choose an implementation, whereas if one uses .getBuilder() from the ChemObject interface you don't need to know. > But the advantage is there will be no need of adding additional methods for > different types; even if a third party object implements a CDK interface it > will still work. > > static Object createObject(String className) throw SomeException { > Object object = null; > try { > Class classDefinition = Class.forName(className); > object = classDefinition.newInstance(); > } catch (InstantiationException e) { > throw new SomeException(x); > } catch (IllegalAccessException e) { > throw new SomeException(x); > } catch (ClassNotFoundException e) { > throw new SomeException(x); > } > return object; > } The problem with this solution is that you need to know the class name... and generally you don't know... A good example is the IO in ChemObjectReader: public ChemObject read(ChemObject object); Both ChemObject's here are interfaces, allowing one to pass a custom ChemObject implementation (CMLReader and CDK-Taverna are users of custom implementations), like in: ChemObjectReader reader = new MDLReader(); ChemFile customFile = new MyCustomChemFile(); reader.read(customFile); // is equivalent to: customFile = reader.read(customFile) Consequently, the ChemObjectReader know *nothing* about which classes to use... it only sees the ChemObject -interface-. However, since only recently, we have the method cdk.interfaces.ChemObject.getBuilder() which actually returns a ChemObjectBuilder for the specific implementation of the interfaces used. In CDK CVS, currently only one complete implementation of the data interfaces exist, being the classes we all used in the past five years. CMLReader uses a custom ChemFile [1], but really extends on the default implementation. CDK-Taverna does the same with a different customized ChemFile class [2]. Consequently, all use the same ChemObjectBuilder implementation [3]. Egon 1. http://cvs.sf.net/viewcvs.py/cdk/cdk-taverna/src/org/openscience/cdk/applications/taverna/CMLChemFile.java 2. http://cvs.sf.net/viewcvs.py/cdk/cdk/src/org/openscience/cdk/io/cml/ChemFileCDO.java 3. http://cvs.sf.net/viewcvs.py/cdk/cdk/src/org/openscience/cdk/DefaultChemObjectBuilder.java |