2016-07-31 4 views
1

Я создал класс, который создает различные экземпляры. Это как фабрика. Поскольку я знаю, что заводский класс является singleton или создает экземпляр как статический метод. , но мой класс - образец прототипа весны. он имеет переменную-член. также есть методы, чтобы вызвать последовательность установить переменную-член после каждого вызова методов.Заводский класс должен быть одноточечным или статическим методом?

Я хочу знать, в этом случае, как это сделать. Вы могли бы порекомендовать лучший способ или хорошее название?

Я работаю на Spring Framework и Java 8 ..

@Component 
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
public class FruiteFactory { 

    private String type; 
    @Setter 
    private Integer field; // set alfter call appleSupplier 

    public FruiteFactory(String type) { 
     Assert.notNull(type) ; 
     this .type = type ; 
    } 

    public < T> T create(Class<T > clazz) { 
     Object result; 
     if (clazz == Apple.class) { 
      result = appleSupplier.get(); 
     } else if (clazz == Banana. class) { 
      result = bananaSupplier.get(); 
     } else { 
      throw new IllegalArgumentException(); 
     } 
     return (T) result; 
    } 

    private Supplier<Apple> appleSupplier =() -> { 
     Apple apple = new Apple(); 
     // ... 
     return apple; 
    }; 

    private Supplier<Banana> bananaSupplier =() -> { 
     Banana banana = new Banana(); 
     banana.setField(field); 
     return banana; 
    }; 
} 


@Service 
public class FruiteService { 
    @Autowired ApplicationContext context; 

    public void buy(String type) { 
     FruiteFactory fruiteFactory = context.getBean(FruiteFactory.class, type); 

     Apple apple = fruiteFactory.create(Apple.class); 
     // save the apple 

     Integer no = apple.getNo(); 
     fruiteFactory.setField(no); 

     Banana banana = fruiteFactory.create(Banana.class); 
     // .... 

    } 
} 
+1

Заводской шаблон никогда не налагает завод на однотонный – Dici

ответ

3

Если вам действительно нужно создать плоды от своего имени класса (который я бы не совет в общем случае), вы должны просто использовать a Map<Class<?>, Supplier<?>>, а затем используйте Class.cast, чтобы вернуть правильный тип.

Кроме того, звучит ужасно неправильно, что на вашем заводе есть поле, используемое только для создания яблок. Это поле обязательно должно быть заключено в любом из ячеек Supplier.

+0

Благодарим вас за ответ. На самом деле у «FruiteFactory» больше поставщиков (вишня, дыня, персик ...) и более переменная члена, что они связаны друг с другом, поэтому предложенная вами карта не может ее использовать. Не могли бы вы предложить мне какой-либо конкретный способ? – dalgoon

+0

Чем больше поставщиков у вас будет, тем более актуальной будет карта – Dici

+0

, например set field1 любое значение после создания яблока. и при создании банана должны ссылаться как на поле1. Другие поставщики одинаковы с ситуацией покрывает этот случай? – dalgoon

Смежные вопросы