If you think a part of code in your JCL will be used more than once, then you can use that code as a instream catalog. If you think the same code might require in some other JCL's. Then remove that part of code and put it in some separate member. So that all the JCL's can use the code from that member.
Simply saying.. Instream procedure can be used only by that JCL. Catalog procedure can be used in N number for JCL's. When you use Catalog procedure, you must use JCLLIB to provide the library which has that Catalog procedure.