Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources

Flyweight Pattern

1. Introduction

The Flyweight Pattern is a structural design pattern that enables efficient sharing of objects to support a large number of fine-grained objects. This pattern is particularly useful in situations where memory usage is a concern and you want to minimize the overhead of creating numerous similar instances.

2. Key Concepts

  • Flyweight: The core object that encapsulates shared state.
  • Intrinsic State: The state that can be shared across multiple objects.
  • Extrinsic State: The state that is unique to each object and cannot be shared.

3. When to Use

Use the Flyweight Pattern when:

  • Many objects share similar states.
  • The cost of creating new objects is high.
  • You want to minimize memory usage.

4. Implementation

Step 1: Define the Flyweight Class

class Flyweight {
    constructor(intrinsicState) {
        this.intrinsicState = intrinsicState; // Shared state
    }

    operation(extrinsicState) {
        // Use intrinsic state and extrinsic state
        console.log(`Intrinsic: ${this.intrinsicState}, Extrinsic: ${extrinsicState}`);
    }
}

Step 2: Create a Flyweight Factory

class FlyweightFactory {
    constructor() {
        this.flyweights = {};
    }

    getFlyweight(intrinsicState) {
        if (!this.flyweights[intrinsicState]) {
            this.flyweights[intrinsicState] = new Flyweight(intrinsicState);
        }
        return this.flyweights[intrinsicState];
    }
}

Step 3: Use the Flyweight

const factory = new FlyweightFactory();

const flyweight1 = factory.getFlyweight('State1');
flyweight1.operation('Unique1');

const flyweight2 = factory.getFlyweight('State1');
flyweight2.operation('Unique2');

console.log(flyweight1 === flyweight2); // true, same instance

5. Best Practices

Always keep intrinsic state shared and extrinsic state unique to avoid unnecessary memory usage.

Consider using Flyweight when the application is expected to have a high number of similar objects, such as in graphics rendering, text formatting, or similar scenarios.

6. FAQ

What is the primary benefit of the Flyweight Pattern?

The primary benefit is reduced memory usage by sharing common states among multiple objects instead of creating separate instances.

Can the Flyweight Pattern be applied in all scenarios?

No, it is best applied in scenarios with a high volume of similar objects where memory optimization is crucial.

How does Flyweight differ from other patterns?

Flyweight emphasizes sharing and memory efficiency, while other patterns might focus on encapsulation, inheritance, or object creation.