抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
适用场景:
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
优点:
- 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
- 当增加一个新的产品族时不需要修改原代码,满足开闭原则。
缺点:
- 当增加一个新的产品系列时,要修改所有工厂类
结构图:
类图:
代码实现:
//抽象工厂
public interface AbstractFactory {
ProductA newProductA();
ProductB newProductB();
}
//工厂1
public class Factory1 implements AbstractFactory {
@Override
public ProductA newProductA() {
return new ProductA1();
}
@Override
public ProductB newProductB() {
return new ProductB1();
}
}
//工厂2
public class Factory2 implements AbstractFactory {
@Override
public ProductA newProductA() {
return new ProductA2();
}
@Override
public ProductB newProductB() {
return new ProductB2();
}
}
//抽象产品A系列
public interface ProductA {
void getInfo();
}
//产品A系列中的A1产品
public class ProductA1 implements ProductA {
@Override
public void getInfo() {
System.out.println("我是产品A系列中的A1产品");
}
}
//产品A系列中的A2产品
public class ProductA2 implements ProductA {
@Override
public void getInfo() {
System.out.println("我是产品A系列中的A2产品");
}
}
//抽象产品B系列
public interface ProductB {
void getInfo();
}
//产品B系列中的B1产品
public class ProductB1 implements ProductB {
@Override
public void getInfo() {
System.out.println("我是产品B系列中的B1产品");
}
}
//产品B系列中的B2产品
public class ProductB2 implements ProductB {
@Override
public void getInfo() {
System.out.println("我是产品B系列中的B2产品");
}
}
//客户端
public class Test {
public static void main(String[] args) {
//只要拿到一个工厂,就能拿到工厂下的所有系列产品
AbstractFactory factory1 = new Factory1();
ProductA productA1 = factory1.newProductA();
ProductB productB1 = factory1.newProductB();
System.out.println("工厂1:");
productA1.getInfo();
productB1.getInfo();
AbstractFactory factory2 = new Factory2();
ProductA productA2 = factory2.newProductA();
ProductB productB2 = factory2.newProductB();
System.out.println("=========================");
System.out.println("工厂2:");
productA2.getInfo();
productB2.getInfo();
}
}