ejemplo color java design-patterns factory

color - jtextfield java



Fábrica en Java cuando los objetos concretos toman diferentes parámetros de constructor (3)

Lo que estás tratando de hacer es simplemente imposible. Si los argumentos del constructor son diferentes, entonces el código del cliente tendrá que hacer un trabajo diferente para un Circle como para un Square y no se puede resolver esto con un código uniforme. Si hay otro trabajo que la fábrica está haciendo además de manejar los argumentos del constructor que usted cree que deberían suceder en una fábrica, entonces necesita publicar esto en su pregunta y establecer la dificultad que está teniendo al factorizar este código común.

Estoy tratando de implementar un patrón Factory en Java. Tengo una clase llamada Shape que se extiende Circle and Triangle. El problema es que el constructor de formas obtiene solo 2 parámetros, mientras que Circle obtiene 3 parámetros y también Triangle (que no mostraré en la sección de códigos porque es idéntico a Circle). Para demostrarlo mejor:

private interface ShapeFactory{ public Shape create(int x, int y); } private class CircleFactory implements ShapeFactory{ public Shape create(float radius, int x, int y){ //error return new Circle(radius, x,y); } }

¿Alguna idea de cómo superar este problema? No debo recibir una entrada del usuario dentro de la fábrica (debe recibirse desde el exterior).

¡Gracias!


Tienes dos opciones:

1) Fábrica abstracta :

RectangularShape extends Shape

RoundShape extends Shape

y RectangularShapeFactory y RoundShapeFactory

2) Builder (ver también el Ítem 2 en Java Efectivo)

public Shape { private final int x; private final int y; private final double radius; private Shape(Builder builder) { x = builder.x; y = builder.y; radius = builder.radius; } public static class Builder { private final int x; private final int y; private double radius; public Builder(int x, int y) { this.x = x; this.y = y; } public Builder radius(double radius) { this.radius = radius; return this; } public Shape build() { return new Shape(this); } } } //in client code Shape rectangle = new Shape.Builder(x,y).build(); Shape circle = new Shape.Builder(x,y).radius(radiusValue).build();


Todas sus implementaciones deben tener la misma cantidad de argumentos, tiene tres opciones:

  • haga que la fábrica almacene los argumentos de suma para que solo tenga que proporcionar el centro, por ejemplo.
  • Haga que la fábrica tome todos los argumentos, aunque algunas fábricas ignoren algunas de ellas.
  • tener un argumento sea de longitud variable. por ejemplo, "doble ..." el problema con esto es que la persona que llama necesita saber qué necesita la fábrica, lo que frustra el propósito de una fábrica. EN MI HUMILDE OPINIÓN.