OpenZeppelin uses the "unstructured storage" proxy pattern.
See the documentation for details:
OpenZeppelin in the proxy patterns blog post (https://blog.openzeppelin.com/proxy-patterns/) explored three proxy pattern options:
An upgradeable contract ...
These 4 are really very well-know patters.
(1) After analysing Delegatecall-based approach, I give up it because of two main reasons: you can only add new variables not delete or change existing ones. So, if you have a struct defined and you want to change a type or add an existing field, if you want to delete a variable etc.... you cannot. Also, it makes ...
In solidity it doesnt have that builtin function but you can create it with eip1167(i think in vyper they implement this as builtin function instead of let you code it your self which is safer): https://eips.ethereum.org/EIPS/eip-1167. It is implemented in this github you can check out: https://github.com/optionality/clone-factory?files=1