Java: шаблон фабричного метода проектирования | Объектно-ориентированный дизайн | Шаблоны проектирования
Опубликовано: 2013-06-28 Factory Design Pattern — это один из шаблонов Creational Design, который широко используется в JDK, а также в таких средах, как Spring MVC и Struts. Шаблон фабричный метод — это объектно-ориентированный порождающий шаблон проектирования для реализации концепции фабрик и решения проблемы создания объектов (продуктов) без указания точного класса объекта, который будет создан. Суть этого шаблона заключается в том, чтобы « определить интерфейс для создания объекта, но позволить классам, реализующим интерфейс, решать, какой класс создавать. Метод Factory позволяет классу отложить создание экземпляра до подклассов «.
Давайте сначала узнаем, как реализовать фабричный шаблон в java. Мы создадим 5 классов для реализации этого шаблона.
- Суперкласс (CrunchfiyCompany.java)
- Суперкласс в шаблоне factory может быть интерфейсом, абстрактным классом или обычным классом Java. В нашем примере у нас есть суперкласс как абстрактный класс с переопределенным методом
toString()
для целей тестирования.
- Суперкласс в шаблоне factory может быть интерфейсом, абстрактным классом или обычным классом Java. В нашем примере у нас есть суперкласс как абстрактный класс с переопределенным методом
- Подкласс1 (CrunchifyEbay.java)
- Обратите внимание, что класс является расширением класса CrunchfiyCompany.
- Подкласс 2 (CrunchifyGoogle.java)
- Обратите внимание, что класс является расширением класса CrunchfiyCompany.
- Фабричный класс (CrunchifyFactoryPattern.java)
- Теперь, когда у нас есть готовые суперклассы и подклассы, мы можем написать наш фабричный класс.
- Мы можем оставить класс Factory Singleton или оставить метод, возвращающий подкласс, статическим.
- Обратите внимание, что на основе входного параметра создается и возвращается другой подкласс.
- Тестовый класс (CrunchifyFactoryPatternTest.java)
- Клиентская программа Simple Test, использующая приведенную выше реализацию фабричного шаблона.
Другое должно гласить:
- Поточно-безопасная и быстрая реализация синглтона в Java
- Что такое Daemon Thread в Java? Пример прилагается
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Super class in factory pattern can be an interface, abstract class or a // normal java class. For our example, we have super class as abstract class // with overridden toString() method for testing purpose. public abstract class CrunchfiyCompany { public abstract String getPhoneNumber ( ) ; public abstract String getZipCode ( ) ; @Override public String toString ( ) { return "Phone #= " + this . getPhoneNumber ( ) + ", Zip Code= " + this . getZipCode ( ) ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Notice that the class is extending CrunchfiyCompany class. public class CrunchifyEbay extends CrunchfiyCompany { private String phoneNumber ; private String zipCode ; public CrunchifyEbay ( String phoneNumber , String zipCode ) { this . phoneNumber = phoneNumber ; this . zipCode = zipCode ; } @Override public String getPhoneNumber ( ) { return this . phoneNumber ; } @Override public String getZipCode ( ) { return this . zipCode ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Notice that the class is extending CrunchfiyCompany class. public class CrunchifyGoogle extends CrunchfiyCompany { private String phoneNumber ; private String zipCode ; public CrunchifyGoogle ( String phoneNumber , String zipCode ) { this . phoneNumber = phoneNumber ; this . zipCode = zipCode ; } @Override public String getPhoneNumber ( ) { return this . phoneNumber ; } @Override public String getZipCode ( ) { return this . zipCode ; } } |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com . crunchify . tutorials ; import com . crunchify . tutorials . CrunchfiyCompany ; import com . crunchify . tutorials . CrunchifyEbay ; import com . crunchify . tutorials . CrunchifyGoogle ; /** * @author Crunchify.com */ // Now that we have super classes and sub-classes ready, we can write our factory class. // We can keep Factory class Singleton or we can keep the method that return the subclass a static. // Notice that based on the input parameter, different subclass is created and returned. public class CrunchifyFactoryPattern { public static CrunchfiyCompany getDetails ( String type , String phoneNumber , String zipCode ) { if ( "Ebay" . equalsIgnoreCase ( type ) ) return new CrunchifyEbay ( phoneNumber , zipCode ) ; else if ( "Google" . equalsIgnoreCase ( type ) ) return new CrunchifyGoogle ( phoneNumber , zipCode ) ; return null ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com . crunchify . tutorials ; import com . crunchify . tutorials . CrunchfiyCompany ; import com . crunchify . tutorials . CrunchifyFactoryPattern ; /** * @author Crunchify.com */ // Simple Test client program that uses above factory pattern implementation. public class CrunchifyFactoryPatternTest { public static void main ( String [ ] args ) { CrunchfiyCompany eBay = CrunchifyFactoryPattern . getDetails ( "Ebay" , "408.123.4567" , "98765" ) ; CrunchfiyCompany google = CrunchifyFactoryPattern . getDetails ( "Google" , "519.123.4567" , "56789" ) ; System . out . println ( "Factory eBay Config::" + eBay ) ; System . out . println ( "Factory Google Config::" + google ) ; } } |
1 2 |
Factory eBay Config : : Phone #= 408.123.4567, Zip Code= 98765 Factory Google Config : : Phone #= 519.123.4567, Zip Code= 56789 |
Другие примеры использования Factory Pattern?
- Методы java.util.Calendar, ResourceBundle и NumberFormat
getInstance()
используют шаблон Factory. -
valueOf()
в классах-оболочках, таких как Boolean, Integer и т. д.
Преимущества фабричного шаблона:
- Он используется, когда у нас есть суперкласс с несколькими подклассами, и на основе ввода нам нужно вернуть один из подклассов. Этот шаблон берет на себя ответственность за создание экземпляра класса из клиентской программы в класс фабрики.
- Фабричный шаблон обеспечивает подход к коду для интерфейса, а не для реализации.
- Фабричный шаблон удаляет экземпляры реальных классов реализации из клиентского кода, делая его более надежным, менее связанным и легко расширяемым. Например, мы можем легко изменить реализацию класса ПК, потому что клиентская программа не знает об этом.
- Фабричный шаблон обеспечивает абстракцию между реализацией и клиентскими классами посредством наследования.
Недостатки:
- Фабрика должна использоваться для семейства объектов. Если классы не расширяют общий базовый класс или интерфейс, их нельзя использовать в шаблоне проектирования фабрики.
Список всех руководств по Java Web Development, Spring MVC.