介绍
GoF 23种设计模式之一。
定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
举例
产品A接口
public interface ProductA {
public void methodA();
}
具体产品A1
public class ProductA1 implements ProductA {
public void methodA() {
System.out.println("厂商1生产ProductA1");
}
}
具体产品A2
public class ProductA2 implements ProductA {
public void methodA() {
System.out.println("厂商2生产ProductA2");
}
}
产品B接口
public interface ProductB {
public void methodB();
}
具体产品B1
public class ProductB1 implements ProductB {
public void methodB() {
System.out.println("厂商1生产ProductB1");
}
}
具体产品B2
public class ProductB2 implements ProductB {
public void methodB() {
System.out.println("厂商2生产ProductB2");
}
}
厂商1的抽象工厂
public abstract class Factory1 {
public abstract ProductA getProductA1();
public abstract ProductB getProductB1();
}
厂商1的具体工厂
public class ConcreteFactory1 extends Factory1 {
public ProductA getProductA1() {
return new ProductA1();
}
public ProductB getProductB1() {
return new ProductB1();
}
}
厂商2的抽象工厂
public abstract class Factory2 {
public abstract ProductA getProductA2();
public abstract ProductB getProductB2();
}
厂商2的具体工厂
public class ConcreteFactory2 extends Factory2 {
public ProductA getProductA2() {
return new ProductA2();
}
public ProductB getProductB2() {
return new ProductB2();
}
}
测试
public class Demo {
public static void main(String[] args) {
Factory1 f1 = new ConcreteFactory1();
ProductA a1 = f1.getProductA1();
ProductB b1 = f1.getProductB1();
a1.methodA();
b1.methodB();
System.out.println("--------------------");
Factory2 f2 = new ConcreteFactory2();
ProductA a2 = f2.getProductA2();
ProductB b2 = f2.getProductB2();
a2.methodA();
b2.methodB();
}
}
执行结果
适用场景
- 客户端不关心具体创建过程的场景;
- 系统有多个产品族,但系统同一时刻只使用其中某一产品族。