It really depends on what you mean by "recipe".
For some, a recipe is just the "amounts" -- setpoints for time, speed, temperature, etc.
For others, a recipe is all that PLUS the sequence of operations. And sometimes that sequence is linear ("Add A. Add B. Mix. Add C. Heat...."), sometimes it's in parallel (Add A and Add; Mix and Add C; when C is done, Heat, even if Mix time isn't done....). Sometimes the sequence is fixed; sometimes it varies per recipe.
Some "recipes" can be run on only one piece of equipment; other plants have multiple paths to run some recipes but not others.
Some have only a few recipes; others have hundreds.
How you design a recipe, and whether it lives in the PLC or in a PC/Server-based database of some kind (which FTView's "Recipe Manager" kinda/sorta qualifies) depends on just what YOU mean by the word "recipe".
---
The second thing that factors in your design is how you want to visualize the recipe to the operator. Your visualization is going to consist of 2 components: Editing recipes and Running recipes.
Fixed sequences are pretty easy; variable sequencers can be trickier, both to Edit and to show where the process is during a run.
For fixed-sequence / setpoint-only recipes, an array of UDTs as others have mentioned work well. In addition to the UDT array (which is your 'cookbook'), you should also make a UDT instance (non-array) for EDIT and another for ACTIVE. The latter allows you to make changes to active batch, without affecting the Master. When editing a recipe, you COP the selected recipe no (via indirect) to EDIT. <Save> COPs it back; <SaveAs> changes the pointer to a different value for the indirect COP.
For system where the phases (an S88 term -- if you're not familiar with the ISA S88 standard, you should spend some time with Google) are executed in a variable way, I've done a few approaches that work well:
(a) something similar to FT View's Recipe Manager, where a bit-pattern is set (in and SQO instruction block!) to trigger what steps a phase gets launched. The phase must be complete to move to the next step.
(b) a Gantt chart type arrangement ("start on step X; end on step Y"), when a phase is launched on step X, but the system doesn't care about the phase until it gets to step Y. This allows for relatively easy parallel but asynchronous operations.
This is a very large rabbit hole, and I'm only scratching the surface. I've built systems where multiple recipes are running on the same line simultaneously, cleaning the front of it while the batch finishes up on the end, or vice versa. But that requires keeping track of equipment allocation, so that one recipe can't use a Unit (another S88 term) until the previous recipe was done with it.
Good luck!