Updated abstract factory pattern