
//abstract factory
interface IFactory {
IProductA createA();
IProductB createB();
}
//concrete factory 1
class Factory1 implements IFactory {
public IProductA createA() {
return new ProductA1();
}
public IProductB createB() {
return new ProductB1();
}
}
//concrete factory 2
class Factory2 implements IFactory {
public IProductA createA() {
return new ProductA2();
}
public IProductB createB() {
return new ProductB2();
}
}
//abstract product A
interface IProductA {
void testA();
}
//abstract product B
interface IProductB {
void testB();
}
//concrete product A1
class ProductA1 implements IProductA {
public void testA() {
System.out.println("test A1");
}
}
//concrete product A2
class ProductA2 implements IProductA {
public void testA() {
System.out.println("test A2");
}
}
//concrete product B1
class ProductB1 implements IProductB {
public void testB() {
System.out.println("test B1");
}
}
//concrete product B2
class ProductB2 implements IProductB {
public void testB() {
System.out.println("test B2");
}
}
//client code
void testFactory(IFactory factory) {
var productA = factory.createA();
var productB = factory.createB();
productA.testA();
productB.testB();
}
testFactory(new Factory1());
//printed: test A1
// test B1
testFactory(new Factory2());
//printed: test A2
// test B2