Dev
Patterns
Abstract Factory

Abstract Factory

O Abstract Factory é um padrão de projeto de software que fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.

// Databases
enum DocumentDB {
  MongoDB,
  Cassandra,
  DynamoDB,
  RavenDB,
  CouchDB,
  Redis,
  Riak,
}
 
// Interface
interface IDocumentDBFactory {
  createCollection(): void;
}
 
// Abstract factory
abstract class DocumentDBFactory {
  public static CreateDocumentDB(db: DocumentDB): IDocumentDBFactory {
    switch (db) {
      case DocumentDB.MongoDB:
        return new Mongo();
      case DocumentDB.Cassandra:
        return new Cassandra();
      default:
        return new Mongo();
    }
  }
}
 
class Mongo implements IDocumentDBFactory {
  createCollection() { }
}
class Cassandra implements IDocumentDBFactory {
  createCollection() { }
}
 
class WorkerDB {
  private _db: IDocumentDBFactory;
  constructor(db: IDocumentDBFactory) {
    this._db = db;
  }
 
  public get db(): IDocumentDBFactory {
    return this._db;
  }
}
 
// Usage
const worker = new WorkerDB(DocumentDBFactory.CreateDocumentDB(DocumentDB.MongoDB));
worker.db.createCollection();