Design Patterns: Factory pattern

·

3 min read

The Factory pattern is a creational design pattern that provides an interface for creating objects but allows subclasses to decide which class to instantiate. This pattern is suitable for projects where there is a need to create objects without having to specify the exact class of object that needs to be created.

A typical example of a project that would benefit from the Factory pattern is useful is the development of a game that has multiple levels or stages. Each level may require the creation of different objects, such as enemies, weapons, and obstacles. By using a Factory pattern, the game can be designed to create these objects dynamically, based on the specific requirements of each level. This can help to reduce the complexity of the code and make it easier to add new levels or modify the behavior of existing ones.

Another example of a project where the Factory pattern is useful is in the development of a framework that supports multiple database types. Different databases may have different APIs and requirements for connecting and retrieving data. Utilizing a Factory pattern ensures the framework can be designed to create the appropriate database object dynamically, based on the specific database type that is being used. This can help to improve the flexibility and portability of the framework and make it easier to add support for new database types in the future.

Typically, the Factory pattern should be used in projects where there is a need to create objects dynamically, without having to specify the exact class of object that needs to be created. It can help to improve the flexibility and maintainability of the code, by reducing the complexity of object creation and making it easier to add new types of objects over time.

// Post Factory
class PostFactory {
  createPost(type, content) {
    switch (type) {
      case 'text':
        return new TextPost(content);
      case 'image':
        return new ImagePost(content);
      case 'video':
        return new VideoPost(content);
      default:
        throw new Error('Invalid post type');
    }
  }
}

// Post Classes
class TextPost {
  constructor(content) {
    this.type = 'text';
    this.content = content;
  }

  render() {
    console.log(`[Text Post] ${this.content}`);
  }
}

class ImagePost {
  constructor(content) {
    this.type = 'image';
    this.content = content;
  }

  render() {
    console.log(`[Image Post] ${this.content}`);
  }
}

class VideoPost {
  constructor(content) {
    this.type = 'video';
    this.content = content;
  }

  render() {
    console.log(`[Video Post] ${this.content}`);
  }
}

// Usage
const postFactory = new PostFactory();

const textPost = postFactory.createPost('text', 'Hello World!');
textPost.render();
// Output: [Text Post] Hello World!

const imagePost = postFactory.createPost('image', 'https://example.com/image.jpg');
imagePost.render();
// Output: [Image Post] https://example.com/image.jpg

const videoPost = postFactory.createPost('video', 'https://example.com/video.mp4');
videoPost.render();
// Output: [Video Post] https://example.com/video.mp4

In the above code, we define a PostFactory class that provides a method to create different types of posts based on the type parameter, such as text, image, and video. The createPost method creates a new instance of the appropriate post class based on the type parameter, and returns it to the client code.

We also define three post classes: TextPost, ImagePost, and VideoPost, which implement the same render method to display the post content in the UI. Each post class has its own type property to identify its type.

In the usage example, we create a new instance of the PostFactory, and use it to create three different types of posts: TextPost, ImagePost, and VideoPost. The createPost method of the PostFactory creates a new instance of the appropriate post class based on the type parameter and returns it to the client code. We can then call the render method on each post instance to display its content in the UI.

The Factory pattern provides a flexible and decoupled architecture for the social media app, where the creation logic is encapsulated in the PostFactory class and the client code can create different types of posts without tightly coupling to the post classes. New post classes can be added dynamically by creating new classes that implement the render method, and registering them with the PostFactory class using the createPost method.

Did you find this article valuable?

Support Clint by becoming a sponsor. Any amount is appreciated!