An open API service indexing awesome lists of open source software.

https://github.com/emahtab/factory-design-pattern


https://github.com/emahtab/factory-design-pattern

design-pattern factory-pattern

Last synced: 3 months ago
JSON representation

Awesome Lists containing this project

README

          

# Factory Pattern

Below is the Code from Java 1.8 JDK

Calendar is an abstract class which have subclasses e.g. `GregorianCalendar` and `JapaneseImperialCalendar`.
Also Calendar class have overloaded static `getInstance()` method, and one static `createCalendar()` method.
The `getInstance()` method finally calls the `createCalendar()` method.

`createCalendar()` method returns the concrete Calendar instance e.g. `GregorianCalendar` or `JapaneseImperialCalendar` etc. depending on the `TimeZone` and `Locale` info passed to `createCalendar()` method.

```java

Calendar is an Abstract class

public abstract class Calendar implements Serializable, Cloneable, Comparable {

public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}

public static Calendar getInstance(TimeZone zone)
{
return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
}

public static Calendar getInstance(Locale aLocale)
{
return createCalendar(TimeZone.getDefault(), aLocale);
}

public static Calendar getInstance(TimeZone zone, Locale aLocale)
{
return createCalendar(zone, aLocale);
}


private static Calendar createCalendar(TimeZone zone, Locale aLocale)
{
CalendarProvider provider =
LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
.getCalendarProvider();
if (provider != null) {
try {
return provider.getInstance(zone, aLocale);
} catch (IllegalArgumentException iae) {
// fall back to the default instantiation
}
}

Calendar cal = null;

if (aLocale.hasExtensions()) {
String caltype = aLocale.getUnicodeLocaleType("ca");
if (caltype != null) {
switch (caltype) {
case "buddhist":
cal = new BuddhistCalendar(zone, aLocale);
break;
case "japanese":
cal = new JapaneseImperialCalendar(zone, aLocale);
break;
case "gregory":
cal = new GregorianCalendar(zone, aLocale);
break;
}
}
}
if (cal == null) {
// If no known calendar type is explicitly specified,
// perform the traditional way to create a Calendar:
// create a BuddhistCalendar for th_TH locale,
// a JapaneseImperialCalendar for ja_JP_JP locale, or
// a GregorianCalendar for any other locales.
// NOTE: The language, country and variant strings are interned.
if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
cal = new BuddhistCalendar(zone, aLocale);
} else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
&& aLocale.getCountry() == "JP") {
cal = new JapaneseImperialCalendar(zone, aLocale);
} else {
cal = new GregorianCalendar(zone, aLocale);
}
}
return cal;
}

}

```

## JapaneseImperialCalendar extends Calendar
```java
class JapaneseImperialCalendar extends Calendar {

}
```
## GregorianCalendar extends Calendar
```java
public class GregorianCalendar extends Calendar {

}
```