Java factory method with parameters

Java Jazzle

A java blog with a collection of examples and tutorials on Java and related technologies. (Under maintenance with continuous updates) Be in touch with java jazzle or k2java.blogspot.com.

Pages

Sunday, March 20, 2011

Spring : Factory methods with parameters

There are 2 ways of passing parameters to the factory-methods

By Xml

public class TestObject < 

private String id;

private TestObject(String id) <
super();
this.id = id;
>

public static TestObject getInstance(String id) <
return new TestObject(i)
>
>

bean id=»testObject» class=»TestObject» factory-method=»getInstance»>
constructor-arg type=»java.lang.String» value=»object-id-123″/>
bean>

By Code

In the context creating file write this :

ApplicationContext container = new ClassPathXmlApplicationContext("/some path/config.xml");
TestObject obj = (TestObject) containter.getBean("testObject","myParameter");

1 comment:

TestObject obj = (TestObject) containter.getBean(«testObject»,»myParameter»); will not work for singleton objects Reply Delete

Chitika

Like Java Jazzle?

Search Java Jazzle

Followers

Subscribe To

Posts

Posts

Comments

Comments

Chitika

Blog Archive

  • ►2013 (3)
    • ►October (2)
    • ►July (1)
    • ▼2011 (1077)
      • ►December (7)
      • ►October (5)
      • ►September (6)
      • ►July (45)
      • ►June (169)
      • ►May (293)
      • ►April (242)
      • ▼March (219)
        • Creating read-only or unmodifiable collection in java
        • Diff. between HashMap and HashTable
        • Get Synchronized Map
        • Getting Synchronized set
        • Difference between String StringBuffer and StringB.
        • Abstract classes vs interfaces
        • Tools for converting c to java source
        • Conversion from decimal to binary
        • Conversion from integer to hexadecimal and vice-versa
        • Conversion from primitive types to String and vice.
        • Covariant Parameter Types
        • Getting the limits of primitive types
        • JPA : Persistence unit
        • JPA 2.0 with EclipseLink
        • JPA resoures for eclipse link
        • JPA : Relationship Example using eclipse link
        • Simple example on JPA with eclipse link
        • Installation — Eclipse link and derby for JPA
        • Relationship Mapping
        • Persistence of fields
        • Spring 3.0 with EL
        • Entities and Transactions in JPA
        • EntityManager in JPA
        • Customizing the Entity object in JPA
        • JPA Architecture
        • JDBC vs ORM
        • JPA : Overview
        • Initialling to zero rather than null
        • Equivalent of function pointers of C in java
        • Get file size in java
        • Extending size of array in java
        • JAX-WS quick tutorial
        • Create XSD file with JAXB
        • More on XML serialization with JAXB
        • Jaxb : Shortcomings of API
        • Jaxb : Validation
        • Marshalling : Jaxb
        • UnMarshalling : Jaxb
        • Jaxb : TABLE OF CONTENTS
        • Jaxb : Binding XML Schemas
        • Generating java classes from xsd (Eclipse) : Jaxb
        • Prerequisites for jaxb
        • JAXB : Generating java classes from xsd
        • How to create a zip file with java.util.zip package
        • Retrieve a compressed file from a ZIP file
        • Retrieve the contents of a ZIP file
        • Uncompress a file in the GZIP format
        • Writing zip file in java
        • Spring : Different ways of DI
        • Convert String to boolean
        • Convert String to byte array
        • Convert from byte array to string
        • Jaxb — Example to generate xml from java class
        • java.lang.NoClassDefFoundError: org/apache/commons.
        • JAXB Architecture
        • JAXB Introduction
        • Using Load time weaving instead of proxies
        • Spring : Creating custom scopes
        • Spring : Life Cycle of bean
        • Spring Index
        • Spring : DisposableBean Interface and Initializing.
        • Spring List Property Example
        • Spring : Lifecycle interface
        • Spring Map Example
        • BeanFactoryPostProcessor interface
        • @Required annotation
        • Spring : BeanPostProcessor interface
        • @PostConstruct and @PreDestroy example
        • Pitfalls with aspect technologies
        • Spring : init-method and destroy-method
        • Spring : BeanNameAware Interface
        • Implementing @Around advice
        • Exception handling with AOP
        • Implementing @After and @AfterReturning advice
        • Named pointcut expression
        • Binding parameters to advice
        • Pointcut expression
        • Spring : Advice and its type
        • Using annotation for configuring advices
        • Spring : Xml style configuration for pointcuts (Be.
        • Writing the Aspect class
        • AOP : Terminology
        • Can an Innerclass be instantiated in Spring?
        • Managing Property files with spring
        • Spring : PropertyOverrideConfigurer
        • Spring : Configuring properties file with Property.
        • Types of Properties in java
        • Spring : Using the P namespace
        • Namespaces in spring
        • Spring : ServiceLocatorFactoryBean Interface
        • Spring : ObjectFactory Interface
        • Spring : ApplicationContextAware Interface
        • Spring : Lookup Method injection
        • Spring : Factory methods with parameters
        • Spring : Creating custom factory-bean
        • Spring : factory-method
        • Spring : Inheritance between beans
        • Various Bean Scopes in Spring
        • Defining scope by annotation in spring
        • ApplicationContext Interface
        • ►February (87)
        • ►January (4)
        • ►2010 (217)
          • ►December (1)
          • ►November (3)
          • ►October (59)
          • ►September (122)
          • ►August (11)
          • ►July (12)
          • ►May (4)
          • ►April (5)
          • ►2009 (9)
            • ►December (9)

            Источник

            Паттерны проектирования: FactoryMethod

            Java-университет

             Паттерны проектирования: FactoryMethod - 1

            Привет! Сегодня мы продолжим изучать паттерны проектирования и поговорим о фабричном методе (FactoryMethod). Ты узнаешь, что это такое и для решения каких задач подходит данный шаблон. Мы рассмотрим этот паттерн проектирования на практике и изучим его структуру. Чтобы все изложенное было тебе понятно, необходимо разбираться в следующих темах:

            1. Наследование в Java.
            2. Абстрактные методы и классы в Java.

            Какую проблему решает фабричный метод

            • седаны
            • универсалы
            • купе
            • седаны AutoRush
            • универсалы AutoRush
            • купе AutoRush
            • седаны OneAuto
            • универсалы OneAuto
            • купе OneAuto

            Немного о шаблоне фабрика

            Напомню: мы построили с тобой небольшую виртуальную кофейню. В ней мы с помощью простой фабрики научились создавать различные виды кофе. Сегодня будем дорабатывать данный пример. Давай вспомним, как выглядела наша кофейня с простой фабрикой. У нас был класс кофе:

             public class Coffee < public void grindCoffee()< // перемалываем кофе >public void makeCoffee() < // делаем кофе >public void pourIntoCup() < // наливаем в чашку >> 
             public class Americano extends Coffee <> public class Cappuccino extends Coffee <> public class CaffeLatte extends Coffee <> public class Espresso extends Coffee <> 
             public class SimpleCoffeeFactory < public Coffee createCoffee (CoffeeType type) < Coffee coffee = null; switch (type) < case AMERICANO: coffee = new Americano(); break; case ESPRESSO: coffee = new Espresso(); break; case CAPPUCCINO: coffee = new Cappuccino(); break; case CAFFE_LATTE: coffee = new CaffeLatte(); break; >return coffee; > > 
             public class CoffeeShop < private final SimpleCoffeeFactory coffeeFactory; public CoffeeShop(SimpleCoffeeFactory coffeeFactory) < this.coffeeFactory = coffeeFactory; >public Coffee orderCoffee(CoffeeType type) < Coffee coffee = coffeeFactory.createCoffee(type); coffee.grindCoffee(); coffee.makeCoffee(); coffee.pourIntoCup(); System.out.println("Вот ваш кофе! Спасибо, приходите еще!"); return coffee; >> 

            Модернизация простой фабрики

            • в итальянской кофейне мы будем использовать исключительно итальянские кофейные бренды, с особым помолом и прожаркой.
            • в американской порции будут чуточку больше, и к каждому заказу будем подавать плавленный зефир — маршмеллоу.
             public class Americano extends Coffee <> public class Cappuccino extends Coffee <> public class CaffeLatte extends Coffee <> public class Espresso extends Coffee <> 
             public class ItalianStyleAmericano extends Coffee <> public class ItalianStyleCappucino extends Coffee <> public class ItalianStyleCaffeLatte extends Coffee <> public class ItalianStyleEspresso extends Coffee <> public class AmericanStyleAmericano extends Coffee <> public class AmericanStyleCappucino extends Coffee <> public class AmericanStyleCaffeLatte extends Coffee <> public class AmericanStyleEspresso extends Coffee <> 

            Раз мы желаем сохранить действующую бизнес-модель неизменной, нам хочется, чтобы метод orderCoffee(CoffeeType type) претерпел минимальное количество изменений. Взглянем на него:

             public Coffee orderCoffee(CoffeeType type)

            Какие варианты у нас есть? Мы ведь уже умеем писать фабрику? Самое простое, что сходу приходит в голову — написать две аналогичные фабрики, а затем передавать нужную реализацию в нашу кофейню в конструкторе. Тогда класс кофейни не изменится. Для начала нам нужно создать новый класс-фабрику, унаследоваться от нашей простой фабрики и переопределить метод createCoffee (CoffeeType type) . Напишем фабрики для создания кофе в итальянском и американском стилях:

             public class SimpleItalianCoffeeFactory extends SimpleCoffeeFactory < @Override public Coffee createCoffee (CoffeeType type) < Coffee coffee = null; switch (type) < case AMERICANO: coffee = new ItalianStyleAmericano(); break; case ESPRESSO: coffee = new ItalianStyleEspresso(); break; case CAPPUCCINO: coffee = new ItalianStyleCappuccino(); break; case CAFFE_LATTE: coffee = new ItalianStyleCaffeLatte(); break; >return coffee; > > public class SimpleAmericanCoffeeFactory extends SimpleCoffeeFactory < @Override public Coffee createCoffee (CoffeeType type) < Coffee coffee = null; switch (type) < case AMERICANO: coffee = new AmericanStyleAmericano(); break; case ESPRESSO: coffee = new AmericanStyleEspresso(); break; case CAPPUCCINO: coffee = new AmericanStyleCappuccino(); break; case CAFFE_LATTE: coffee = new AmericanStyleCaffeLatte(); break; >return coffee; > > 

            Теперь мы можем передавать нужную реализацию фабрики в CoffeeShop. Давай посмотрим, как бы выглядел код для заказа кофе из разных кофеен. Например, капучино в итальянском и американском стилях:

            Мы создали две различные кофейни, передав в каждую нужную фабрику. С одной стороны, мы достигли поставленной задачи, но с другой стороны. Что-то скребет неуемную душу предпринимателя… Давай разбираться, что не так. Во-первых, обилие фабрик. Это что, каждый раз теперь под новую точку свою фабрику создавать и вдобавок следить за тем, чтобы при создании кофейни в конструктор передавалась нужная фабрика? Во-вторых, это все еще простая фабрика. Просто немного модернизированная. Мы тут все-таки новый паттерн изучаем. В-третьих, а что, нельзя что ли по-другому? Вот было бы классно, если бы мы могли локализовать все вопросы по приготовлению кофе внутри класса CoffeeShop , связав процессы по созданию кофе и обслуживанию заказа, но при этом сохранив достаточную гибкость, чтобы делать кофе в различных стилях. Ответ — да, можно. Это называется шаблон проектирования фабричный метод.

            От простой фабрики к фабричному методу

            1. Вернем метод createCoffee(CoffeeType type) в класс CoffeeShop .
            2. Данный метод сделаем абстрактным.
            3. Сам класс CoffeeShop станет абстрактным.
            4. У класса CoffeeShop появятся наследники.
             public abstract class Coffee < public void makeCoffee()< // делаем кофе >public void pourIntoCup() < // наливаем в чашку >> 
             public abstract class CoffeeShop < public Coffee orderCoffee(CoffeeType type) < Coffee coffee = createCoffee(type); coffee.makeCoffee(); coffee.pourIntoCup(); System.out.println("Вот ваш кофе! Спасибо, приходите еще!"); return coffee; >protected abstract Coffee createCoffee(CoffeeType type); > 

            Шаг 3. Создадим итальянскую кофейню, класс-потомок абстрактной кофейни. В нем мы реализуем метод createCoffee(CoffeeType type) с учетом итальянской специфики.

             public class ItalianCoffeeShop extends CoffeeShop < @Override public Coffee createCoffee (CoffeeType type) < Coffee coffee = null; switch (type) < case AMERICANO: coffee = new ItalianStyleAmericano(); break; case ESPRESSO: coffee = new ItalianStyleEspresso(); break; case CAPPUCCINO: coffee = new ItalianStyleCappuccino(); break; case CAFFE_LATTE: coffee = new ItalianStyleCaffeLatte(); break; >return coffee; > > 
             public class AmericanCoffeeShop extends CoffeeShop < @Override public Coffee createCoffee (CoffeeType type) < Coffee coffee = null; switch (type) < case AMERICANO: coffee = new AmericanStyleAmericano(); break; case ESPRESSO: coffee = new AmericanStyleEspresso(); break; case CAPPUCCINO: coffee = new AmericanStyleCappuccino(); break; case CAFFE_LATTE: coffee = new AmericanStyleCaffeLatte(); break; >return coffee; > > 

            Поздравляю тебя. Мы только что реализовали шаблон проектирования фабричный метод на примере нашей кофейни.

            Принцип работы фабричного метода

             Паттерны проектирования: FactoryMethod - 2

            Теперь рассмотрим подробнее, что же у нас получилось. На диаграмме ниже — получившиеся классы. Зеленые блоки — классы создатели, голубые — классы продукты. Какие выводы можно сделать?

            1. Все продукты — реализации абстрактного класса Coffee .
            2. Все создатели — реализации абстрактного класса CoffeeShop .
            3. Мы наблюдаем две параллельные иерархии классов:
              • Иерархия продуктов. Мы видим итальянских потомков и американских потомков
              • Иерархия создателей. Мы видим итальянских потомков и американских потомков
            4. У суперкласса CoffeeShop нет информации о том, какая конкретно реализация продукта ( Coffee ) будет создана.
            5. Суперкласс CoffeeShop делегирует создание конкретного продукта своим потомкам.
            6. Каждый потомок класса CoffeeShop реализует фабричный метод createCoffee() в соответствии со своей спецификой. Иными словами, внутри реализаций классов-создателей принимается решение о приготовлении конкретного продукта, исходя из специфики класса создателя.

            Теперь ты готов к определению паттерна фабричный метод . Паттерн фабричный метод определяет интерфейс создания объекта, но позволяет субклассам выбрать класс создаваемого экземпляра. Таким образом, Фабричный метод делегирует операцию создания экземпляра субклассам. В общем, не столь важно помнить определение, как понимать, как все работает.

            Структура фабричного метода

             Паттерны проектирования: FactoryMethod - 3

            На схеме выше представлена общая структура паттерна фабричный метод. Что еще здесь важно?

            1. Класс Creator содержит реализации всех методов, взаимодействующих с продуктами, кроме фабричного метода.
            2. Абстрактный метод factoryMethod() должен быть реализован всеми потомками класса Creator .
            3. Класс ConcreteCreator реализует метод factoryMethod() , непосредственно производящий продукт.
            4. Данный класс отвечает за создание конкретных продуктов. Это единственный класс с информацией о создании этих продуктов.
            5. Все продукты должны реализовывать общий интерфейс — быть потомками общего класса-продукта. Это нужно, чтобы классы, использующие продукты, могли оперировать ими на уровне абстракций, а не конкретных реализаций.

            Домашнее задание

            Итак, сегодня мы провели довольно большую работу и изучили паттерн проектирования фабричный метод. Самое время закрепить пройденный материал! Задание 1. Поработать над открытием еще одной кофейни. Она может быть выполнена в английском стиле или испанском. Или даже в стиле космического корабля. Добавим пищевых красителей в кофе, чтоб блестело, и вообще, кофе будет просто космос! Задание 2. На прошлой лекции у тебя было задание создать виртуальный суши-бар либо виртуальную пиццерию. Твоя задача — не стоять на месте. Сегодня ты узнал, как с помощью шаблона фабричный метод можно придти к успеху. Пора воспользоваться этими знаниями и расширить собственный бизнес 😉

            Источник

            Читайте также:  Hide keyboard android kotlin
Оцените статью