This looks like it's trying to be an Abstract Factory, but you seem to have taken a weird approach to implementing it...?