How to create a module to allow for multiple instances of the same module with different variable parameters
Generate your blocks same way block module does: appending an id. Then store your configuration indexed by this id. You can store your values in a custom table (see schema api and install file syntax) or in the variable table (using variable_get() and variable_set()).

Whenever an operation with a block happens you receive the block id. Use the block id to access or set your configuration data. For example, the code for rendering a block should be the same for all your custom blocks, but you feed that code with different configurations that you read from your custom table or variable table using the provided block id.