В идеальном дизайне общедоступные классы имеют отношение " является ", а не " является расширением " в том смысле, что они могут быть расширены, но вы не замечаете этого с точки зрения интерфейса. Это лучше всего достигается, если вы на самом деле приказываете объектам делать что-то , а вы не получаете / не устанавливаете их. В этом случае фабрики могут просто создавать то, что нужно, и клиентам не нужно знать фактический класс (полиморфизм).
Это не всегда возможно / просто, так что приведение может быть решением, но вы можете утверждать, что в этом случае может не потребоваться фабрика (O_derived_X может создать сам объект Prod_X).