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
- Host: GitHub
- URL: https://github.com/emahtab/factory-design-pattern
- Owner: eMahtab
- Created: 2022-02-18T02:28:33.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2022-02-18T13:49:07.000Z (about 4 years ago)
- Last Synced: 2025-02-02T03:25:44.265Z (about 1 year ago)
- Topics: design-pattern, factory-pattern
- Homepage:
- Size: 7.81 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
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 {
}
```