Upgradeable proxy contracts- Seperating logic, functionality, & storage contracts. Examples? Resources?

OpenZeppelin documentation refers to both (2) and (3) together as the implementation contract. These could either be together or separate (using inheritance) as you suggested. There is some discussion in this thread about separating the storage contract, and The Graph uses a similar pattern.

Note the proxy contract generally should NOT inherit from the storage contract -- ideally the proxy contract should not have any storage variables at all (and should only use unstructured storage) otherwise it could conflict with the implementation in terms of storage layout.

You can just use a standard proxy contract and don't usually need to write one yourself. We suggest using the Upgrades Plugins which help with deploying the implementation and proxy contract together using the various available proxy patterns.