add abstract factory pattern demo