For Pastry Cream
In a medium-sized bowl, whisk together milk, cream, and egg yolks until thoroughly combined.
In a medium-sized saucepan, whisk together sugar, cornstarch and salt. While still whisking, drizzle cream mixture into sugar mixture until thoroughly combined and no lumps.
Cook over medium heat, stirring constantly, until mixture thickens to a pudding-like consistency and coats the back of a spoon.
Remove from heat and pour through a fine-mesh strainer into a heatproof bowl. Whisk in butter, 1 Tablespoon at a time, and then stir in vanilla extract.
Place a piece of plastic wrap or parchment paper directly against the surface of the pastry cream and transfer to the refrigerator to cool completely. Once the cream has cooled and you are ready to prepare your frosting, you will need to remove the pastry cream and your butter from the refrigerator and allow them to warm nearly room temperature (not too warm so that the butter is becoming oily, though).
For German Buttercream
NOTE: (Pastry cream and softened butter must be the same temperature in order to proceed)
Place softened butter in the bowl of a stand mixer (or you may use a large bowl and an electric mixer) and use a whisk attachment to beat butter on high speed until fluffy and lightened in color (about 3-5 minutes).
Reduce mixer speed to medium and begin to gradually add pastry cream, one spoonful (approximately 1-2 Tablespoons) at a time, allowing the first spoonful to be completely incorporated before adding the next.
Once all pastry cream has been added, slowly increase mixer speed to medium-high and beat until you have a fluffy frosting.
Taste frosting, stir in powdered sugar if desired, then pipe (I used an Ateco 848 piping tip) or spread over cake/cupcakes.