O programador deve ficar atento às oportunidades de não instanciar objetos explicitamente e mais do que isso: usar no lugar de construtores públicos métodos controladores de instâncias ou constantes.

public static Tipo m(t b){

  return new Tipo(b);

}

 

public static Tipo m(t b){

 

  return Tipo.CONSTANTE1;

}

 

Se for usado método ou constante podemos usar nome específico (ao invés de ficar preso ao nome da classe no caso de construtor. Não há obrigação de que seja criado um novo objeto (podem ser usados objetos previamente criados: “flyweight”). O trecho abaixo é um “fair use”do livro “Effective Java” (p. 14).

// Builder Pattern

public class NutritionFacts{

  private final int servingSize;

  private final int servings;

  private final int calories;

  private final int fat;

  private final int sodium;

  private final int carbohydrate;

  public static class Builder {

    //Required parameters

    private final int servingSize;

    private final int servings;

    //Optional parameters-initialized to default values

    private int calories = 0;

    private int fat = 0;

    private int carbohydrate = 0;

    private int sodium = 0;

    public Builder(int servingSize, int servings){

      this.servingSize = servingSize;

      this.servings = servings;

    }

    public Builder calories(int val)

      {calories = val; return this;}

    public Builder fat(int val)

      { fat = val; return this; }

    public Builder carbohydrate(int val)

      { carbohydrate = val; return this; }

    public Builder sodium(int val)

      { sodium = val; return this; }

    public NutritionFacts build(){

      return new NutritionFacts(this);

    }

  }

  private NutritionFacts(Builder builder){

    servingSize = builder.servingSize;

    servings = builder.servings;

    calories = builder.calories;

    fat = builder.fat;

    sodium = builder.sodium;

    carbohydrate = builder.carbohydrate;

  }

}