Create a (reusable) page object per widget (widget= button, combobox, textfield, ...). The constructor of a widget accept a WebElement or a By object. Every page object should use the reusable page object. Here is the example of a simple login page.
public class MyLoginPage {
private TextField mUsername;
private TextField mPassword;
private Button mSignon;
...
// getter
public TextField getUsername() {
return mUsername;
}
}
With the use of some heuristics you should be able to choose the correct widget to be use. This should answer your first question.
For the second question.
Either you implement specific method on your page object that return you another page object. Something like that:
public MyHomePage clickSignon() {
this.mSignon.click();
return new MyHomePage(...);
}
You can also implement the button as a generic class.
The method click on the Button widget:
public <T extends Widget> T click() {
... // coe that makes the click
return new T(...);
}
The member declaration inside the login page:
private Button mSignon<MyHomePage>;
So you can write:
MyHomePage hp = loginPage.getSignon().click();
Either you implement a factory of page object. The factory is able to determine the current state of the screen and return you the page objct that match what you see. You can determine that by trying to find some specific element on the screen (i.e. The button for the login is only present on the login page).
Not at all a definitive answer, but I hope it already give you direction. Don't hesitate to post a question in the comment and I will update this answer.