add abstract factory and facade pattern