classDiagram
class AbstractFactory{
<>
+createProductA() AbstractProductA
+createProductB() AbstractProductB
}

class ConcreteFactory1 {
    +createProductA() ProductA1
    +createProductB() ProductB1
}

class ConcreteFactory2 {
    +createProductA() ProductA2
    +createProductB() ProductB2
}

class AbstractProductA {
    <<interface>>
    +operationA()
}

class ProductA1 {
    +operationA()
}

class ProductA2 {
    +operationA()
}

class AbstractProductB {
    <<interface>>
    +operationB()
}

class ProductB1 {
    +operationB()
}

class ProductB2 {
    +operationB()
}

AbstractFactory <|.. ConcreteFactory1
AbstractFactory <|.. ConcreteFactory2

AbstractProductA <|.. ProductA1
AbstractProductA <|.. ProductA2

AbstractProductB <|.. ProductB1
AbstractProductB <|.. ProductB2

ConcreteFactory1 --> ProductA1
ConcreteFactory1 --> ProductB1

ConcreteFactory2 --> ProductA2
ConcreteFactory2 --> ProductB2