Giter Site home page Giter Site logo

abstract-factory-factory's Introduction

abstract-factory-factory

Inspired by this blog post, this utilizes reflect-metadata + decorators to get factory-created subclass instances of a base class from factories that you register with a decorator.

Example

import { AbstractFactoryFactory } from 'abstract-factory-factory'

interface IPokemonProps {
  name: string
  color: string
}

abstract class Pokemon implements IPokemonProps {
  public name: string
  public color: string

  constructor (props: IPokemonProps) {
    this.name = props.name
    this.color = props.color
  }

  abstract attack(): string
}

// Create Abstract Factory and decorator to register factories
const PokemonFactory = AbstractFactoryFactory.createAbstractFactory(Pokemon)
const registerPokemonFactory = AbstractFactoryFactory.createRegisterFactoryDecorator(Pokemon)

class Pikachu extends Pokemon {
  private isElectricCat: boolean

  constructor (isElectricCat: boolean) {
    super({ name: 'Pikachu', color: 'yellow' })
    this.isElectricCat = isElectricCat
  }

  attack(): string {
    if (this.isElectricCat) {
      return 'Zap attack!'
    }
    return 'Scratch!'
  }
}

@registerPokemonFactory(Pikachu)
class PikachuFactory {
  public static create() {
    return new Pikachu(true)
  }
}

class Snorlax extends Pokemon {
  private asleep: boolean

  constructor(asleep: boolean) {
    super({ name: 'Snorlax', color: 'blue'})
    this.asleep = asleep
  }

  attack(): string {
    if (!this.asleep) {
      return 'Body slam!'
    }
    return 'Snorlax is still asleep...'
  }
}

@registerPokemonFactory(Snorlax)
class SnorlaxFactory {
  public static create() {
    return new Snorlax(true)
  }
}

const electricCat = PokemonFactory.create(Pikachu)
const sleepingSnorlax = PokemonFactory.create(Snorlax)

console.log(electricCat.attack())
console.log(sleepingSnorlax.attack())

// Output:
//   Zap attack!
//   Snorlax is still asleep...

abstract-factory-factory's People

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

paragrudani1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.