add abstract factory patterns and singleton factory
Merge branch 'feature-factory' into develop