Skip to content
BytePatterns

Factory Pattern

Low-Level Design: lesson 8 of 15

Ask for what you want; one place decides which class to build.

Lesson 8 of 15 · 4 min

Factory Pattern

Step 1 of 11

Scattered Van() calls hard-wire every caller to a concrete class.

The Idea

Scattered SomeClass() calls hard-wire every caller to a concrete type. A factory takes a key and returns an object honouring a shared interface. Choosing moves to one function, and unknown keys fail there with a clear message instead of anywhere.

Real-World Example

A car hire desk. You booked "estate, automatic" and you are handed whichever car in today's fleet meets that class. You never name a model, and the depot can retire one and buy another without telling you.

The Code

class Estate:  seats, boot = 5, 550      # three products, one shared shape
class Van:     seats, boot = 3, 3000
class Compact: seats, boot = 4, 300

FLEET = {"estate": Estate, "van": Van, "compact": Compact}

def hire(car_class):                     # callers name a class, never a constructor
    if car_class not in FLEET:
        raise ValueError("no such class: " + car_class)
    return FLEET[car_class]()

car = hire("van")
print(type(car).__name__, car.seats, car.boot)   # Van 3 3000
print(type(hire("estate")).__name__)             # Estate

Python

Your turn

What does this print?

class Cat:
  def sound(self): return "meow"

class Cow:
  def sound(self): return "moo"

MAKERS = {"cat": Cat, "cow": Cow}

def make(key): return MAKERS[key]()

print(make("cow").sound(), type(make("cat")).__name__)

Mini quiz

1 / 3

A factory's job is to:

New lessons land every few weeks

Leave an address and we will tell you when the next one is up. That is the only reason we will use it.

One address, stored so we can email you. Nothing else, ever.