Вы теряете несколько преимуществ шаблона строителя, как уже указывалось ( новый уродлив и труднее поддерживать и протекать детали по сравнению с чистым строителем).
Однако мне больше всего не хватает того, что шаблон компоновщика можно использовать для обеспечения того, что называется «плавными интерфейсами» .
Вместо этого:
ProductConfig config = new ProductConfig("Vodka");
config.alcohol = 0.38;
config.size = 0.7;
config.price = 17.99;
Product p = new Product(config);
Вы можете сделать:
ProductFactory.create()
.drink("Vodka")
.whereAlcohoolLevelIs(0.38)
.inABottleSized(0.7)
.pricedAt(17.99)
.build();
Не всем нравятся беглые интерфейсы, но они определенно очень хорошо используют шаблон строителя (все бегло интерфейсы должны использовать шаблон компоновщика, но не все шаблоны компоновщика являются свободными интерфейсами).
В некоторых замечательных коллекциях Java, таких как коллекции Google, очень либерально и очень хорошо используются «плавные интерфейсы» . Я бы выбрал их в любой день по сравнению с вашим подходом «легче вводить / меньше символов» :)
import inspect
def get_class_that_defined_method(meth):
for cls in inspect.getmro(meth.im_class):
if meth.__name__ in cls.__dict__:
return cls
return None