Implement Factory model