- Java Jazzle
- Pages
- Sunday, March 20, 2011
- Spring : Factory methods with parameters
- By Xml
- By Code
- 1 comment:
- Chitika
- Like Java Jazzle?
- Search Java Jazzle
- Followers
- Subscribe To
- Chitika
- Blog Archive
- Паттерны проектирования: FactoryMethod
- Какую проблему решает фабричный метод
- Немного о шаблоне фабрика
- Модернизация простой фабрики
- От простой фабрики к фабричному методу
- Принцип работы фабричного метода
- Структура фабричного метода
- Домашнее задание
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
Привет! Сегодня мы продолжим изучать паттерны проектирования и поговорим о фабричном методе (FactoryMethod). Ты узнаешь, что это такое и для решения каких задач подходит данный шаблон. Мы рассмотрим этот паттерн проектирования на практике и изучим его структуру. Чтобы все изложенное было тебе понятно, необходимо разбираться в следующих темах:
- Наследование в Java.
- Абстрактные методы и классы в 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 , связав процессы по созданию кофе и обслуживанию заказа, но при этом сохранив достаточную гибкость, чтобы делать кофе в различных стилях. Ответ — да, можно. Это называется шаблон проектирования фабричный метод.
От простой фабрики к фабричному методу
- Вернем метод createCoffee(CoffeeType type) в класс CoffeeShop .
- Данный метод сделаем абстрактным.
- Сам класс CoffeeShop станет абстрактным.
- У класса 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; > >
Поздравляю тебя. Мы только что реализовали шаблон проектирования фабричный метод на примере нашей кофейни.
Принцип работы фабричного метода
Теперь рассмотрим подробнее, что же у нас получилось. На диаграмме ниже — получившиеся классы. Зеленые блоки — классы создатели, голубые — классы продукты. Какие выводы можно сделать?
- Все продукты — реализации абстрактного класса Coffee .
- Все создатели — реализации абстрактного класса CoffeeShop .
- Мы наблюдаем две параллельные иерархии классов:
- Иерархия продуктов. Мы видим итальянских потомков и американских потомков
- Иерархия создателей. Мы видим итальянских потомков и американских потомков
- У суперкласса CoffeeShop нет информации о том, какая конкретно реализация продукта ( Coffee ) будет создана.
- Суперкласс CoffeeShop делегирует создание конкретного продукта своим потомкам.
- Каждый потомок класса CoffeeShop реализует фабричный метод createCoffee() в соответствии со своей спецификой. Иными словами, внутри реализаций классов-создателей принимается решение о приготовлении конкретного продукта, исходя из специфики класса создателя.
Теперь ты готов к определению паттерна фабричный метод . Паттерн фабричный метод определяет интерфейс создания объекта, но позволяет субклассам выбрать класс создаваемого экземпляра. Таким образом, Фабричный метод делегирует операцию создания экземпляра субклассам. В общем, не столь важно помнить определение, как понимать, как все работает.
Структура фабричного метода
На схеме выше представлена общая структура паттерна фабричный метод. Что еще здесь важно?
- Класс Creator содержит реализации всех методов, взаимодействующих с продуктами, кроме фабричного метода.
- Абстрактный метод factoryMethod() должен быть реализован всеми потомками класса Creator .
- Класс ConcreteCreator реализует метод factoryMethod() , непосредственно производящий продукт.
- Данный класс отвечает за создание конкретных продуктов. Это единственный класс с информацией о создании этих продуктов.
- Все продукты должны реализовывать общий интерфейс — быть потомками общего класса-продукта. Это нужно, чтобы классы, использующие продукты, могли оперировать ими на уровне абстракций, а не конкретных реализаций.
Домашнее задание
Итак, сегодня мы провели довольно большую работу и изучили паттерн проектирования фабричный метод. Самое время закрепить пройденный материал! Задание 1. Поработать над открытием еще одной кофейни. Она может быть выполнена в английском стиле или испанском. Или даже в стиле космического корабля. Добавим пищевых красителей в кофе, чтоб блестело, и вообще, кофе будет просто космос! Задание 2. На прошлой лекции у тебя было задание создать виртуальный суши-бар либо виртуальную пиццерию. Твоя задача — не стоять на месте. Сегодня ты узнал, как с помощью шаблона фабричный метод можно придти к успеху. Пора воспользоваться этими знаниями и расширить собственный бизнес 😉