Abstract Method#

Produce families of related objects without specifying their concrete classes.

@startuml
Client o-- AbstractFactory
AbstractFactory <|--left ConcreteFactory1
AbstractFactory <|--right ConcreteFactory2
ConcreteFactory1 --> ConcreteProductA1
ConcreteFactory1 --> ConcreteProductB1
ConcreteFactory2 --> ConcreteProductA2
ConcreteFactory2 --> ConcreteProductB2
AbstractProductA <|--down ConcreteProductA1
AbstractProductA <|--up ConcreteProductA2
AbstractProductB <|--down ConcreteProductB1
AbstractProductB <|--up ConcreteProductB2

class Client {
  factory: AbstractFactory
  main()
}
note left of Client::main
productA = factory.create_productA()
productB = factory.create_productB()
end note

interface AbstractFactory {
  create_productA()
  create_productB()
}

class ConcreteFactory1 {
  create_productA()
  create_productB()
}

class ConcreteFactory2 {
  create_productA()
  create_productB()
}
@enduml