2015-08-13 23:54:40 +02:00
---
layout: pattern
title: Factory Method
folder: factory-method
2015-08-15 18:03:05 +02:00
permalink: /patterns/factory-method/
2015-08-20 21:40:07 +02:00
categories: Creational
2016-08-20 13:17:53 +05:30
tags:
2019-12-13 21:09:28 +02:00
- Extensibility
2015-09-22 18:25:56 +05:30
- Gang Of Four
2015-08-13 23:54:40 +02:00
---
2016-01-03 21:14:30 +01:00
## Also known as
Virtual Constructor
2015-11-04 21:13:32 +02:00
2016-01-03 21:14:30 +01:00
## Intent
Define an interface for creating an object, but let subclasses
2015-08-13 23:54:40 +02:00
decide which class to instantiate. Factory Method lets a class defer
instantiation to subclasses.
2017-08-12 20:02:14 +03:00
## Explanation
Real world example
2017-08-12 21:44:21 +03:00
2017-08-12 20:02:14 +03:00
> Blacksmith manufactures weapons. Elves require Elvish weapons and orcs require Orcish weapons. Depending on the customer at hand the right type of blacksmith is summoned.
In plain words
2017-08-12 21:44:21 +03:00
2017-08-12 20:02:14 +03:00
> It provides a way to delegate the instantiation logic to child classes.
Wikipedia says
2017-08-12 21:44:21 +03:00
2017-08-12 20:02:14 +03:00
> In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method—either specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling a constructor.
**Programmatic Example**
Taking our blacksmith example above. First of all we have a blacksmith interface and some implementations for it
2018-03-28 01:35:43 -04:00
```java
2017-08-12 20:02:14 +03:00
public interface Blacksmith {
Weapon manufactureWeapon(WeaponType weaponType);
}
public class ElfBlacksmith implements Blacksmith {
public Weapon manufactureWeapon(WeaponType weaponType) {
2019-10-30 11:57:24 +05:30
return ELFARSENAL.get(weaponType);
2017-08-12 20:02:14 +03:00
}
}
public class OrcBlacksmith implements Blacksmith {
public Weapon manufactureWeapon(WeaponType weaponType) {
2019-10-30 11:57:24 +05:30
return ORCARSENAL.get(weaponType);
2017-08-12 20:02:14 +03:00
}
}
```
Now as the customers come the correct type of blacksmith is summoned and requested weapons are manufactured
2017-08-12 21:44:21 +03:00
2018-03-28 01:35:43 -04:00
```java
2019-12-22 18:11:19 +05:30
var blacksmith = new ElfBlacksmith();
2017-08-12 20:02:14 +03:00
blacksmith.manufactureWeapon(WeaponType.SPEAR);
blacksmith.manufactureWeapon(WeaponType.AXE);
// Elvish weapons are created
```
2015-08-13 23:54:40 +02:00
2019-12-07 20:01:13 +02:00
## Class diagram

2016-01-03 21:14:30 +01:00
## Applicability
Use the Factory Method pattern when
2015-08-13 23:54:40 +02:00
* a class can't anticipate the class of objects it must create
* a class wants its subclasses to specify the objects it creates
2015-08-15 18:03:05 +02:00
* classes delegate responsibility to one of several helper subclasses, and you want to localize the knowledge of which helper subclass is the delegate
2015-09-22 18:25:56 +05:30
2017-12-11 11:45:32 -03:00
## Real world examples
2016-07-04 21:52:39 +03:00
2016-08-20 13:17:53 +05:30
* [java.util.Calendar ](http://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance-- )
* [java.util.ResourceBundle ](http://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String- )
* [java.text.NumberFormat ](http://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getInstance-- )
* [java.nio.charset.Charset ](http://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html#forName-java.lang.String- )
* [java.net.URLStreamHandlerFactory ](http://docs.oracle.com/javase/8/docs/api/java/net/URLStreamHandlerFactory.html#createURLStreamHandler-java.lang.String- )
* [java.util.EnumSet ](https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html#of-E- )
* [javax.xml.bind.JAXBContext ](https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBContext.html#createMarshaller-- )
2016-07-04 21:52:39 +03:00
2016-01-03 21:14:30 +01:00
## Credits
2015-09-22 18:25:56 +05:30
* [Design Patterns: Elements of Reusable Object-Oriented Software ](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612 )