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] Simple Factory

    Published Apr 25, 2022 [  DesignPattern  ]

    Real world example

    Consider, you are building a house and you need doors. You can either put on your carpenter clothes, bring some wood, glue, nails and all the tools required to build the door and start building it in your house or you can simply call the factory and get the built door delivered to you so that you don’t need to learn anything about the door making or to deal with the mess that comes with making it.

    In plain words

    Simple factory simply generates an instance for client without exposing any instantiation logic to the client

    Wikipedia says

    In object-oriented programming (OOP), a factory is an object for creating other objects – formally a factory is a function or method that returns objects of a varying prototype or class from some method call, which is assumed to be “new”.

    Programmatic Example

    First of all we have a door interface and the implementation

    interface Door {
        getWidth(): number;
        getHeight(): number
    }
    
    class WoodenDoor implements Door {
        protected width;
        protected height;
    
        constructor(width: number, height: number) {
            this.width = width;
            this.height = height;
        }
    
        getWidth(): number {
            return this.width;
        }
    
        getHeight(): number {
            return this.height;
        }
    }
    

    Then we have our door factory that makes the door and returns it

    class DoorFactory {
        static makeDoor(width: number, height: number): Door{
            return new WoodenDoor(width, height);
        }
    }
    
    

    And then it can be used as

    let door: Door = DoorFactory.makeDoor(100, 200);
    console.log(door.getWidth())
    console.log(door.getHeight())
    
    let door2: Door = DoorFactory.makeDoor(50, 100)
    

    When to Use?

    When creating an object is not just a few assignments and involves some logic, it makes sense to put it in a dedicated factory instead of repeating the same code everywhere.

    References