But we still needed to solve the problem of instantiation, the problem of what to do if your application needed more than one instance of a software abstraction. The key to solving this problem was provided by the idea of an Abstract Data Type. An ADT is simply a programmer-defined data type that can be manipulated in a manner similar to system provided data types.
So, in particular, this implied both the information hiding abilities of the module concept, but as well the notion that the programmer could create many different instances, or copies, of the new data type. Thus, for example, one could create a complex number ADT, and write programs that minipulated a large number of complex numbers.