ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/tengDissertation/Appendix.tex
(Generate patch)

Comparing trunk/tengDissertation/Appendix.tex (file contents):
Revision 2821 by tim, Thu Jun 8 06:39:37 2006 UTC vs.
Revision 2827 by tim, Thu Jun 8 20:05:53 2006 UTC

# Line 131 | Line 131 | is declared as
131   is declared as
132   \begin{lstlisting}[float,caption={[A classic Singleton design pattern implementation(I)] Declaration of {\tt IntegratorFactory} class.},label={appendixScheme:singletonDeclaration}]
133  
134 <  class IntegratorFactory {
135 <    public:
136 <      static IntegratorFactory* getInstance();
134 > class IntegratorFactory {
135 >  public:
136 >    static IntegratorFactory* getInstance();
137      protected:
138        IntegratorFactory();
139      private:
140        static IntegratorFactory* instance_;
141 <  };
141 > };
142 >
143   \end{lstlisting}
144   The corresponding implementation is
145 < \begin{lstlisting}[float,caption={[A classic Singleton design pattern implementation(II)] Implementation of {\tt IntegratorFactory} class.},label={appendixScheme:singletonImplementation}]
145 > \begin{lstlisting}[float,caption={[A classic implementation of Singleton design pattern (II)] Implementation of {\tt IntegratorFactory} class.},label={appendixScheme:singletonImplementation}]
146  
147   IntegratorFactory::instance_ = NULL;
148  
# Line 151 | Line 152 | IntegratorFactory* getInstance() {
152    }
153    return instance_;
154   }
155 +
156   \end{lstlisting}
157   Since constructor is declared as {\tt protected}, a client can not
158   instantiate {\tt IntegratorFactory} directly. Moreover, since the
# Line 166 | Line 168 | implemented by delegating the creation operation to th
168   with the problem of creating objects without specifying the exact
169   class of object that will be created. Factory Method is typically
170   implemented by delegating the creation operation to the subclasses.
169 \begin{lstlisting}[float,caption={[].},label={appendixScheme:factoryDeclaration}]
170  class IntegratorCreator;
171  class IntegratorFactory {
172    public:
173      typedef std::map<std::string, IntegratorCreator*> CreatorMapType;
171  
172 <      /**
173 <       * Registers a creator with a type identifier
174 <       * @return true if registration is successful, otherwise return false
175 <       * @id the identification of the concrete object
176 <       * @creator the object responsible to create the concrete object
180 <       */
181 <      bool registerIntegrator(IntegratorCreator* creator);
172 > Registers a creator with a type identifier. Looks up the type
173 > identifier in the internal map. If it is found, it invokes the
174 > corresponding creator for the type identifier and returns its
175 > result.
176 > \begin{lstlisting}[float,caption={[The implementation of Factory pattern (I)].},label={appendixScheme:factoryDeclaration}]
177  
178 <      /**
179 <       * Looks up the type identifier in the internal map. If it is found, it invokes the
180 <       * corresponding creator for the type identifier and returns its result.
186 <       * @return a pointer of the concrete object, return NULL if no creator is registed for
187 <       * creating this concrete object
188 <       * @param id the identification of the concrete object
189 <       */
190 <      Integrator* createIntegrator(const std::string& id, SimInfo* info);
178 > class IntegratorFactory {
179 >  public:
180 >    typedef std::map<string, IntegratorCreator*> CreatorMapType;
181  
182 <    private:
183 <      CreatorMapType creatorMap_;
184 <  };
182 >    bool registerIntegrator(IntegratorCreator* creator);
183 >
184 >    Integrator* createIntegrator(const string& id, SimInfo* info);
185 >
186 >  private:
187 >    CreatorMapType creatorMap_;
188 > };
189 >
190   \end{lstlisting}
191  
192 < \begin{lstlisting}[float,caption={[].},label={appendixScheme:factoryDeclarationImplementation}]
198 <  bool IntegratorFactory::unregisterIntegrator(const std::string& id) {
199 <    return creatorMap_.erase(id) == 1;
200 <  }
192 > \begin{lstlisting}[float,caption={[The implementation of Factory pattern (II)].},label={appendixScheme:factoryDeclarationImplementation}]
193  
194 <  Integrator* IntegratorFactory::createIntegrator(const std::string& id, SimInfo* info) {
195 <    CreatorMapType::iterator i = creatorMap_.find(id);
196 <    if (i != creatorMap_.end()) {
197 <      //invoke functor to create object
198 <      return (i->second)->create(info);
199 <    } else {
200 <      return NULL;
201 <    }
194 > bool IntegratorFactory::unregisterIntegrator(const string& id) {
195 >  return creatorMap_.erase(id) == 1;
196 > }
197 >
198 > Integrator* IntegratorFactory::createIntegrator(const string& id,
199 >                                                SimInfo* info) {
200 >  CreatorMapType::iterator i = creatorMap_.find(id);
201 >  if (i != creatorMap_.end()) {
202 >    return (i->second)->create(info);
203 >  } else {
204 >    return NULL;
205    }
206 + }
207 +
208   \end{lstlisting}
209  
210 < \begin{lstlisting}[float,caption={[].},label={appendixScheme:integratorCreator}]
210 > \begin{lstlisting}[float,caption={[The implementation of Factory pattern (III)].},label={appendixScheme:integratorCreator}]
211  
212 <  class IntegratorCreator {
212 > class IntegratorCreator {
213    public:
214 <    IntegratorCreator(const std::string& ident) : ident_(ident) {}
218 <    virtual ~IntegratorCreator() {}
219 <    const std::string& getIdent() const { return ident_; }
214 >    IntegratorCreator(const string& ident) : ident_(ident) {}
215  
216 +    const string& getIdent() const { return ident_; }
217 +
218      virtual Integrator* create(SimInfo* info) const = 0;
219  
220    private:
221 <    std::string ident_;
222 <  };
221 >    string ident_;
222 > };
223  
224 <  template<class ConcreteIntegrator>
225 <  class IntegratorBuilder : public IntegratorCreator {
224 > template<class ConcreteIntegrator>
225 > class IntegratorBuilder : public IntegratorCreator {
226    public:
227 <    IntegratorBuilder(const std::string& ident) : IntegratorCreator(ident) {}
228 <    virtual  Integrator* create(SimInfo* info) const {return new ConcreteIntegrator(info);}
229 <  };
227 >    IntegratorBuilder(const string& ident) : IntegratorCreator(ident) {}
228 >    virtual  Integrator* create(SimInfo* info) const {
229 >      return new ConcreteIntegrator(info);
230 >    }
231 > };
232   \end{lstlisting}
233  
234   \subsection{\label{appendixSection:visitorPattern}Visitor}
235  
236   The purpose of the Visitor Pattern is to encapsulate an operation
237 < that you want to perform on the elements of a data structure. In
238 < this way, you can change the operation being performed on a
239 < structure without the need of changing the class heirarchy of the
240 < elements that you are operating on.
237 > that you want to perform on the elements. The operation being
238 > performed on a structure can be switched without changing the
239 > interfaces  of the elements. In other words, one can add virtual
240 > functions into a set of classes without modifying their interfaces.
241 > The UML class diagram of Visitor patten is shown in
242 > Fig.~\ref{appendixFig:visitorUML}. {\tt Dump2XYZ} program in
243 > Sec.~\ref{appendixSection:Dump2XYZ} uses Visitor pattern
244 > extensively.
245  
246 < \begin{lstlisting}[float,caption={[].},label={appendixScheme:visitor}]
247 <  class BaseVisitor{
248 <    public:
249 <      virtual void visit(Atom* atom);
250 <      virtual void visit(DirectionalAtom* datom);
251 <      virtual void visit(RigidBody* rb);
249 <  };
250 < \end{lstlisting}
251 < \begin{lstlisting}[float,caption={[].},label={appendixScheme:element}]
252 <  class StuntDouble {
253 <    public:
254 <      virtual void accept(BaseVisitor* v) = 0;
255 <  };
246 > \begin{figure}
247 > \centering
248 > \includegraphics[width=\linewidth]{visitor.eps}
249 > \caption[The architecture of {\sc OOPSE}] {Overview of the structure
250 > of {\sc OOPSE}} \label{appendixFig:visitorUML}
251 > \end{figure}
252  
253 <  class Atom: public StuntDouble {
258 <    public:
259 <      virtual void accept{BaseVisitor* v*} {v->visit(this);}
260 <  };
253 > \begin{lstlisting}[float,caption={[The implementation of Visitor pattern (I)]Source code of the visitor classes.},label={appendixScheme:visitor}]
254  
255 <  class DirectionalAtom: public Atom {
256 <    public:
257 <      virtual void accept{BaseVisitor* v*} {v->visit(this);}
258 <  };
255 > class BaseVisitor{
256 >  public:
257 >    virtual void visit(Atom* atom);
258 >    virtual void visit(DirectionalAtom* datom);
259 >    virtual void visit(RigidBody* rb);
260 > };
261  
262 <  class RigidBody: public StuntDouble {
268 <    public:
269 <      virtual void accept{BaseVisitor* v*} {v->visit(this);}
270 <  };
262 > \end{lstlisting}
263  
264 + \begin{lstlisting}[float,caption={[The implementation of Visitor pattern (II)]Source code of the element classes.},label={appendixScheme:element}]
265 +
266 + class StuntDouble {
267 +  public:
268 +    virtual void accept(BaseVisitor* v) = 0;
269 + };
270 +
271 + class Atom: public StuntDouble {
272 +  public:
273 +    virtual void accept{BaseVisitor* v*} {
274 +      v->visit(this);
275 +    }
276 + };
277 +
278 + class DirectionalAtom: public Atom {
279 +  public:
280 +    virtual void accept{BaseVisitor* v*} {
281 +      v->visit(this);
282 +    }
283 + };
284 +
285 + class RigidBody: public StuntDouble {
286 +  public:
287 +    virtual void accept{BaseVisitor* v*} {
288 +      v->visit(this);
289 +    }
290 + };
291 +
292   \end{lstlisting}
293   \section{\label{appendixSection:concepts}Concepts}
294  
# Line 277 | Line 297 | freedom.  Here is a diagram of the class heirarchy:
297   collections of atoms or atoms which have orientational degrees of
298   freedom.  Here is a diagram of the class heirarchy:
299  
300 < %\begin{figure}
301 < %\centering
302 < %\includegraphics[width=3in]{heirarchy.eps}
303 < %\caption[Class heirarchy for StuntDoubles in {\sc oopse}-3.0]{ \\
304 < %The class heirarchy of StuntDoubles in {\sc oopse}-3.0. The
285 < %selection syntax allows the user to select any of the objects that
286 < %are descended from a StuntDouble.} \label{oopseFig:heirarchy}
287 < %\end{figure}
288 <
300 > \begin{figure}
301 > \centering
302 > \includegraphics[width=3in]{heirarchy.eps}
303 > \caption[Class heirarchy for StuntDoubles in {\sc oopse}-3.0]{ The
304 > class heirarchy of StuntDoubles in {\sc oopse}-3.0.
305   \begin{itemize}
306   \item A {\bf StuntDouble} is {\it any} object that can be manipulated by the
307   integrators and minimizers.
# Line 293 | Line 309 | DirectionalAtom}s which behaves as a single unit.
309   \item A {\bf DirectionalAtom} is an atom which has {\it orientational} as well as translational degrees of freedom.
310   \item A {\bf RigidBody} is a collection of {\bf Atom}s or {\bf
311   DirectionalAtom}s which behaves as a single unit.
312 < \end{itemize}
312 > \end{itemize}} \label{oopseFig:heirarchy}
313 > \end{figure}
314  
315   Every Molecule, Atom and DirectionalAtom in {\sc OOPSE} have their
316   own names which are specified in the {\tt .md} file. In contrast,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines