factory method
abstrat factory structure