Para que un componente sea realmente reutilizable, debes hacer que dependa de un numero pequeño de clases y que tenga una funcionalidad clara y solo una.
Dicho de otra forma, si haces una clase Cliente, esa clase puede contener los datos del cliente y algún método relacionado con algo algo del cliente, pero no debe saber escribirse en base de datos, en un fichero xml, pintarse en un gráfico y además imprimirse.
La mejor forma de hacer componentes reutilizables es dividir tu proyecto en mini-proyectos independientes. Por ejemplo, quieres hacer un juego de marcianos. Piensate (y haz) primero unas clases para mover iconos por pantalla, sin pensar para nada en marcianos. Hazte otro grupo de clases para captura de teclas al vuelo. Hazte otro grupo de clases para llevar una lista de jugadores y sus puntuaciones, etc, etc. Cuando tengas todo lo que se te haya ocurrido, hazte el programa de marcianos usando tus componentes.
La idea es sencilla, sin embargo por experiencia te aseguro que es muy dificil y requiere mucha practica aislarte de tu programa concreto (los marcianos) al hacer el componente reutilizable (la libreria de mover iconos). Al final, si no eres muy cuidadoso, acabas haciendo una libreria de mover iconos marcianos.
Se bueno.