I am building a program to run several different analyses on a dataset. The different kinds of analysis are each represented by a different kind of analysis tool object (e.g. "AnalysisType1" and "AnalysisType2"). The analysis tools share many of the same parameters. The program is operated from a GUI, in which all the parameters are set by the user. What I'm trying to figure out, is what is the most elegant/best way to share the parameters between all the components of the program. Options I can think of include:

Keep all the parameters in the GUI, and pass to each analysis tool when it is executed.
Keep parameters in each of the tools, and update the parameters in all the tools every time they are changed in the GUI. Then they are ready to go whenever an analysis is executed.
Create a ParameterSet object that holds all the parameters for all the components. Give a reference to this ParameterSet object to every component that needs it, and update its parameters whenever they are changed in the GUI.

I've already tried #1, followed by #2, and as the complexity is growing, I'm considering moving to #3. Are there any reasons not to take this approach?
How about creating a parent class to all Analysis that will have common attributes (maybe static) and methods?
This way when you implement a new AnalysisType you inherit all the parameters and you can change them in a single place.
Sharing Parameters between Objects