Wizard pour la création d'une Usine

Read this page in english Go back

Ce Wizard génère un objet dont le rôle est de fabriquer d'autres objets. Ce design pattern permet de contrôler la création d'une famille d'objets particulière.

Pour ce design pattern il faudra indiquer :
  • Préciser le nom de la classe
  • Préciser le type d'objet qui seront gérés par la factory
  • Indiquer si vous désirez que cette factory deviennent aussi un manager, c.a.d qu'il est possible de lui confier des objets instanciés à l'extérieur de la classe.


  • Voici un exemple d'une classe Java générée par le plugin, ceci est une factory d'objet java.lang.Integer :
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    public final class IntegerFactory {
    
      /** This is the list of object. */
      protected Map objectMap;
    
      /** This is the default instance used for this singleton. */
      private static IntegerFactory defaultInstance;
    
      /**
       * Constructor of the object. <br>
       *
       * This constructor should remain private
       */
      private IntegerFactory() {
        super();
        this.objectMap = new HashMap();
        // Put your code here
      }
    
      /**
       * Gets the unique instance of this class. <br>
       *
       * @return the unique instance of this class
       */
      public final synchronized static IntegerFactory getInstance() {
        if (IntegerFactory.defaultInstance == null) {
          IntegerFactory.defaultInstance = new IntegerFactory();
        }
        return IntegerFactory.defaultInstance;
      }
    
      /**
       * Gives a string representation of this object. <br>
       * 
       * @return a String representation of this object
       */
      public String toString() {
        StringBuffer sb = new StringBuffer(128);
        sb.append('{');
        Iterator it = this.objectMap.values().iterator();
        while (it.hasNext()) {
          sb.append(it.next());
          sb.append(", ");
        }
        it = null;
        if (this.objectMap.size() > 0) {
          int length = sb.length();
          sb.delete(length - 2, length);
        }
        sb.append('}');
        return sb.toString();
      }
    
      /**
       * Gives an element in the factory. <br>
       * 
       * @param aKey key of the object to find
       * @return the object available at the given key
       */
      public Integer get(Object aKey) {
        return (Integer) this.objectMap.get(aKey);
      }
    
      /**
       * Gives an element in the factory. <br>
       * 
       * @param aKey key of the object to find
       * @param createIfAbstent if true and object is not present then the create(aKey) 
       * method will be used. Warning : this will cause an error if no plublic empty 
       * constructor is available in class Integer
       * @return the object available at the given key
       */
      public Integer get(Object aKey, boolean createIfAbstent) {
        Integer resu = (Integer) this.objectMap.get(aKey);
        if (resu == null && createIfAbstent) {
          resu = this.create(aKey);
        }
        return resu;
      }
    
      /**
       * Clears the map.
       */
      public void clear() {
        this.objectMap.clear();
      }
    
      /**
       * Indicates if the factory is empty.
       * 
       * @return true if the factory is empty, false if not
       */
      public boolean isEmpty() {
        return this.objectMap.size() == 0;
      }
    
      /**
       * Deletes the factory.
       * 
       * Use this method for memory leak, the factory will not be useable anymore
       */
      public void delete() {
        this.clear();
        this.objectMap = null;
      }
    
      /**
       * Returns the number of element in the factory.
       * 
       * @return the number of element in the factory
       */
      public int size() {
        return this.objectMap.size();
      }
    
      /**
       * Tests if an element is present or not. <br>
       * 
       * @param anElm the object to find
       * @return true if the element is present, false if not present
       */
      public boolean containsValue(Integer anElm) {
        return this.objectMap.containsValue(anElm);
      }
    
      /**
       * Creates an element and manage it. <br>
       *
       * The element is put in the map, and returned. <br>
       *
       * Caution : if a contructor needs a basic type (like int, double,
       * char, ...), you will be forced to pass it by creating a wrapper 
       * (Integer, Double, Character). Doing so, you will also have to 
       * precise in the boolean array (<i>isBasicType</i>) that this argument is a basic type and not an Object.
       *
       * @param aKey the key that will identify the object created
       * @param params an array of parameters to use with the constructor of the object
       * @param isBasicType an array of boolean that indicates if the params[i] is a basic type or not
       */
      public Integer create(
        Object aKey,
        Object[] params,
        boolean[] isBasicType) {
        Class[] paramsType = null;
        if (params != null) {
          paramsType = new Class[params.length];
          for (int i = 0; i < params.length; i++) {
            if (isBasicType[i]) {
              if (params[i] instanceof Integer) {
                paramsType[i] = Integer.TYPE;
              } else if (params[i] instanceof Double) {
                paramsType[i] = Double.TYPE;
              } else if (params[i] instanceof Float) {
                paramsType[i] = Float.TYPE;
              } else if (params[i] instanceof Long) {
                paramsType[i] = Long.TYPE;
              } else if (params[i] instanceof Byte) {
                paramsType[i] = Byte.TYPE;
              } else if (params[i] instanceof Short) {
                paramsType[i] = Short.TYPE;
              } else if (params[i] instanceof Character) {
                paramsType[i] = Character.TYPE;
              }
            } else {
              paramsType[i] = params[i].getClass();
            }
          }
        }
        try {
          Constructor ct = Integer.class.getConstructor(paramsType);
          Integer resu = (Integer) ct.newInstance(params);
          this.objectMap.put(aKey, resu);
          return resu;
        } catch (NoSuchMethodException nse) {
          nse.printStackTrace();
        } catch (InvocationTargetException ite) {
          ite.printStackTrace();
        } catch (IllegalAccessException iae) {
          iae.printStackTrace();
        } catch (InstantiationException ie) {
          ie.printStackTrace();
        }
        return null;
      }
    
      /**
       * Creates an element and manage it. <br>
       *
       * The element is put in the map, and returned. <br>
       * By default, all parameters will be concidered as Object, and not basic type. <br>
       *
       * @param aKey the key that will identify the object created
       * @param params an array of parameters to use with the constructor of the object
       */
      public Integer create(Object aKey, Object[] params) {
        boolean[] isBasicType = new boolean[params.length];
        return this.create(aKey, params, isBasicType);
      }
    
      /**
       * Creates an element and manage it. <br>
       *
       * The element is put in the map, and returned. <br>
       * By default, this method will try to use the constructor of the object that has no parameter. <br>
       *
       * @param aKey the key that will identify the object created
       */
      public Integer create(Object aKey) {
        return this.create(aKey, new Object[0], new boolean[0]);
      }
    
      /**
       * Removes the element with the specified key in this factory.
       *
       * @param aKey the key of the object to remove.
       */
      public void remove(Object aKey) {
        this.objectMap.remove(aKey);
      }
    }
      

    Remarques :

    Pour toutes remarques, commentaires idées, bugs : Contact