Hi,
keep in mind that a pooling manager does nothing more than serve objects. Without a pooling manager, you keep references to your prefabs somewhere and instantiate and destroy them as needed. With a pooling manager you do exactly the same, but instead of instantiating and destroying you use Spawn() and Despawn(). With SmartPool, you don't neccessarely need to keep references to the prefabs, because you can optionally get them by their name.
So for each prefab, add a SmartPool object, assign the prefab, set properties and replace the instantiate and destroy commands with calls to SmartPool. In your first example, create 12 Smartpool components, assign the 12 Prefabs and name the pools by number, e.g. Fish0, Fish1, Fish2 etc...
In your code, when you need a random fish, do "myFish=SmartPool.Spawn("Fish"+Mathf.Random(0i,11i));" to get a random fish. After receiving the fish, initialize it like you would without SmartPool and you're done. Wen you don't need the fish anymore, use "SmartPool.Despawn(myFish)" to return it to the pool.
Jake