Added additional template parameter for Shared_pointer type

This revision now requires the user of the class to provide an
additional template argument for the type of pointer to be returned by
the Factory.  There are 3 options available -- all of which are defined
directly in this code:
- Shared_Pointer
- Unique_Pointer
- Raw_Pointer
with each of these types referring to std::shared_ptr<T>, std::unique_ptr<T>,
and T*, respectively.