add more impls: composite, factory-method, strategy;