Why does SBOL have both Component and ComponentDefinition?
The key to understanding this is to think about a system with more than one copy of a genetic construct. 

For example, let's say you have a construct that uses two copies of the pBAD promoter, each regulating a different coding sequence. Both of these promoters are pBAD promoters, with the same sequence and type information, so they should share the same ComponentDefinition.

But there are two copies. In the context of the larger construct, we need to be able to talk about each copy separately. For example, we might need to say that the first comes after a MoClo cut site, while the second comes after a terminator. For that, we need the Component object, to have a way to say "this particular copy of pBAD", as opposed to "pBAD in general", which is what the ComponentDefinition tells us about.