Tags

  • AWS (7)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (15)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • MathHistory (1)
  • MySQL (21)
  • Neovim (10)
  • Network (66)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (3)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    [Creational] Factory Method

    Published Apr 26, 2022 [  DesignPattern  ]

    Real world example

    Consider the case of a hiring manager. It is impossible for one person to interview for each of the positions. Based on the job opening, she has to decide and delegate the interview steps to different people.

    In plain words

    It provides a way to delegate the instantiation logic to child classes.

    Wikipedia says

    In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method—either specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling a constructor.

    Programmatic Example

    Taking our hiring manager example above. First of all we have an interviewer interface and some implementations for it

    interface Interviewer {
        askQuestions();
    }
    
    class Developer implements Interviewer {
        askQuestions() {
            console.log('Asking about design patterns');
        }
    }
    
    class CommunityExecutive implements Interviewer {
        askQuestions() {
            console.log('Asking about community building');
        }
    }
    

    Now let us create our HiringManager

    abstract class HiringManager {
        // factory method
        protected abstract makeInterviewer(): Interviewer;
    
        public takeInterview(){
            let interviewer: Interviewer = this.makeInterviewer();
            interviewer.askQuestions();
        }
    }
    

    Now any child can extend it and provide the required interviewer

    class DevelopmentManager extends HiringManager {
        protected makeInterviewer(): Interviewer {
            return new Developer();
        }
    }
    
    class MarketingManager extends HiringManager{
        protected makeInterviewer(): Interviewer {
            return new CommunityExecutive();
        }
    }
    

    and then it can be used as

    let devManager = new DevelopmentManager();
    devManager.takeInterview();
    
    let marketingManager = new MarketingManager();
    marketingManager.takeInterview();
    

    When to use?

    Useful when there is some generic processing in a class but the required sub-class is dynamically decided at runtime. Or putting it in other words, when the client doesn’t know what exact sub-class it might need.

    References