I don't believe passing in the driver each time you locate an element is the way to go, but I understand you are aiming to avoid repeating code. You could instead have a class that accesses a driver class, which is instantiated at the start of your code. This way you can pass in a 'type' and 'attribute' which will locate any implemented element. eg. Type: Id, Class, XPath; and Attribute: "text", "//div[@class="class"]/div[2]".
So,
DriverClass: Has a WebDriver that implements FindElement with a switch for each type.
WrapperClass: Which has classes such as 'Click' or 'DoesElementExist' which uses DriverClass to implement functionality.
TestClass: Using calls to WrapperClass implements your code logic.
You could go further and implement common groupings of actions in another class that utilises WrapperClass so TestClass becomes a lot cleaner.