Factory Pattern

  • GoF:
  • Wiki:
  • Other:

Concepts

  • Doesn't expose instantiation logic
  • Defer to subclasses
  • Common interfaces
  • Specified by architecture, implemented by user
  • Examples:
    • Calendar (many consider this as Singleton example due to no arg getInstance() method)
    • ResourceBundle
    • NumberFormat

Design Considerations

  • Factory is responsible for lifecycle
  • It has common interface
  • For this common interface, there are Concrete classes
  • Parameterized create method

Example/Demo

  • Create Pages
  • Create Website
  • Create concrete classes
  • Create factory
  • Create Enum

Flow:

Website (abstract class)
abstract void createWebsite()
public List<Page> getPages()
__________________________|___________________________
| |
Blog extends Website Shop extends Website
- PostPage - CartPage
- AboutPage - ItemPage
- CommentPage - SearchPage
- ContactPage
WebsiteFactory
factoryMethod(Type type) {
Switch (type):
BLOG:
return new Blog();
Shop
return new Shop();
}

Drawbacks:

  • Complexity
  • Creation in subclass **
  • Refactoring: This is not something that is refactored later, rather a design decision to make early in development

Contrast to other patterns

SingletonFactory
Returns same instanceReturns various instances
one constructor method - no argsmultiple constructors
no interfaceInterface Driven
No SubclassesAlways SubClasses are involved in a way or other
NAAdaptable to environment more easily**

Summary

  • Parameter Driven (chooses type based on this)
  • Solves Complex creation (Choose type at runtime)
  • A little complex
  • Opposite of a Singleton