Design patterns are a good example of a form of reuse. We extract the common behaviour from a series of things and realize that it can be applied to a whole bunch of other things. When we are designing systems and we recognize a pattern, we can apply our knowledge of the pattern to the solution. The advantage is that our solutions exhibit a lot of the same behaviour so it is easier to learn how they work. The disadvantage is that there is work involved in extracting a pattern and creating the rules for applying that pattern in other situations.
Someone has to extract the common behaviour from a given set of circumstances.
The pattern has to then be stated in such a way that others can understand it and apply it to their own situations. Creating a reusable asset is a very difficult thing to do. The catch is in creating something that others can understand and reuse without having to consult the creator. The intended use of the asset must be described, along with some scenarios for its use and proper supporting documentation that describes the constraints of the asset. This is required for reusable assets at all levels, including code.