code: package edu.berkeley.nlp.util;
  
  import java.io.Serializable;
  import java.util.HashSet;
  import java.util.Set;
  import java.util.TreeSet;
  
  /**
   * The MapFactory is a mechanism for specifying what kind of map is to be used
   * by some object. For example, if you want a Counter which is backed by an
   * IdentityHashMap instead of the defaul HashMap, you can pass in an
   * IdentityHashMapFactory.
   * 
   * @author Dan Klein
   */
  
  public abstract class SetFactory<K> implements Serializable {
  
  	public static class HashSetFactory<K> extends SetFactory<K> {
  		private static final long serialVersionUID = 1L;
  
  		@Override
  		public Set<K> buildSet() {
  			return new HashSet<K>();
  		}
  	}
  
  	public static class IdentityHashMapFactory<K> extends SetFactory<K> {
  		private static final long serialVersionUID = 1L;
  
  		@Override
  		public Set<K> buildSet() {
  			return new IdentityHashSet<K>();
  		}
  	}
  
  	public static class TreeMapFactory<K> extends SetFactory<K> {
  		private static final long serialVersionUID = 1L;
  
  		@Override
  		public Set<K> buildSet() {
  			return new TreeSet<K>();
  		}
  	}
  
  	public abstract Set<K> buildSet();
  }
  