Updated factory structure with abstract factory