Neste artigo, a partir de um exemplo simples de fabrica (Factory) na linguagem Java, vou mostrar como implementar esta mesma fabrica, porem para criar objetos gerenciados pelo container, usando CDI.Como exemplo vou usar uma fabrica de formas que, dado um tipo de forma, retorna uma instancia deste tipo.Para este exemplo teremos duas formas, o retangulo e o circulo, listadas na enumeracao ShapeType.public enum ShapeType { RECTANGLE, CIRCLE}A classe abstrata Shape representa uma forma generica. Shape possui uma dependencia do tipo ShapeDependency, que deve ser passada como parametro para o seu construtor.public abstract class Shape { private ShapeDependency dependency; public Shape(ShapeDependency dependency) { this.dependency = dependency; } public ShapeDependency getDependency() { return dependency; }}A classe ShapeDependency por sua vez, possui a propriedade name, a qual deve ser passada como parametro para o seu construtor.public class ShapeDependency { private String name; public ShapeDependency(String name) { this.name = name; } public String getName() { return name; }}As classes Rectangle e Circle sao formas especificas, subclasses de Shape. Elas instanciam ShapeDependency nos seus construtores e passam esta instancia para o construtor da superclasse Shape, ja recebendo o name correto.public class Rectangle extends Shape { public Rectangle() { super(new ShapeDependency("Rectangle dependency")); }}public class Circle extends Shape { public Circle() { super(new ShapeDependency("Circle dependency")); }}Por fim, a fabrica ShapeFactory possui o metodo create que retorna uma instancia da classe Shape, de acordo com o ShapeType recebido por parametro.public class ShapeFactory { public Shape create(ShapeType type) { if(RECTANGLE.equals(type)){ return new Rectangle(); } if(CIRCLE.equals(type)){ return new Circle(); } return null; }}Ate aqui tudo tranquilo, nada diferente de uma fabrica comum. Mas e se a instancia retornada pela fabrica possui uma dependencia gerenciada pelo container?Para ilustrar este caso, Shape tera a sua dependencia injetada por CDI.public abstract class Shape { @Inject private ShapeDependency dependency; public ShapeDependency getDependency() { return dependency; }}Rectangle e Circle teriam de configurar a dependencia num metodo anotado com @PostConstruct, pois este sera executado pelo container apos a injecao da dependencia, ao contrario do construtor, que e executado antes, o que ocasionaria NullPointerException.public class Rectangle extends Shape { @PostConstruct public void setUp() { dependency.setName("Rectangle dependency"); }}public class Circle extends Shape { @PostConstruct public void setUp() { dependency.setName("Circle dependency"); }}E ShapeDependency teria o valor da propriedade name configurado num setter, pois o container usa apenas o construtor vazio (sem parametros) para instanciar as classes que ele gerencia.public class ShapeDependency { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; }}Neste novo contexto, o problema e que o metodo create de ShapeFactory nao pode mais criar a instancia de Shape com um comando new, pois esta nova instancia nao tera sua dependencia injetada, ja que com este comando e voce que esta gerenciando o ciclo de vida da instancia, nao o container.Voce tambem nao pode simplesmente injetar Shape na ShapeFactory, pois Shape e uma classe abstrata e o container nao saberia qual subclasse injetar, Rectangle ou Circle.E mesmo que o container injetasse uma delas arbitrariamente, ele o faria ao instanciar ShapeFactory, e nos so sabemos de qual subclasse de Shape queremos