GoF设计模式——抽象工厂模式
h5打开以查看为什么需要抽象工厂模式?在GoF设计模式——工厂方法模式中,工厂方法模式解决了"新增产品不改老代码"的问题:将创建职责分散到多个具体工厂,每个工厂只管一种产品,新增产品时只需新增工厂类。但工厂方法模式有一个隐藏缺陷:每个工厂只管一个产品。现实中,产品往往是成套出现的——比如一个品牌的手机有高端机和中低端机,它们属于同一个"产品族",需要配套使用。产品族就是同一风格/品牌下的一组相关产品。古典风格的沙发必须搭配古典风格的椅子,不能混搭。如果用工厂方法模式(每种产品一个独立工厂):// 工厂方法模式:沙发和椅子各自有独立的工厂,无法保证风格统一 SofaFactory sofaFactory = new ClassicalSofaFactory(); ChairFactory chairFactory = new ModernChairFactory(); // 搭错了! Sofa sofa = sofaFactory.create(); Chair chair = chairFactory.create(); // 结果:古典沙发配现代椅子,风格不统一回头看,工厂方法模式只关注"单一产品"的扩展性,却忽略了"一族产品"的兼容性。抽象工厂模式就是来解决这个问题的——一个工厂负责一个产品族,同一工厂创建的所有产品风格/品牌一致。概念抽象工厂模式(Abstract Factory)是一种创建型设计模式,核心思想是提供一个接口来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式包含以下角色:抽象产品接口:定义产品的接口,产品族有多少种产品就有多少个抽象产品(本例有沙发、椅子两种)具体产品类:实现抽象产品接口,属于某个产品族(如古典沙发属于古典产品族)抽象工厂接口:声明一组创建产品的方法,每个方法对应一种产品具体工厂类:实现抽象工厂接口,一个具体工厂负责一个产品族(如古典工厂只创建古典风格的沙发和椅子)类关系说明:两个具体工厂实现抽象工厂接口,四个具体产品各自实现对应的抽象产品接口。抽象工厂依赖两个抽象产品——每个具体工厂创建的产品都是同一族的。核心要点:抽象工厂解决的核心问题是产品配套使用。一个工厂对应一个产品族,同一工厂创建的产品风格/品牌一定一致。如果产品之间没有配套约束,就不需要用这个模式。实现基础实现抽象工厂的实现思想是用一个工厂接口声明创建一族产品的多个方法,每个具体工厂实现这些方法并返回同族的产品。// 抽象产品 A public interface AbstractProductA { public void operationA(); } // 抽象产品 B public interface AbstractProductB { public void operationB(); } // 具体产品 A1(产品族 1 的 A 类产品) public class ConcreteProductA1 implements AbstractProductA { @Override public void operationA() { System.out.println("ProductA1 的操作"); } } // 具体产品 A2(产品族 2 的 A 类产品) public class ConcreteProductA2 implements AbstractProductA { @Override public void operationA() { System.out.println("ProductA2 的操作"); } } // 具体产品 B1(产品族 1 的 B 类产品) public class ConcreteProductB1 implements AbstractProductB { @Override public void operationB() { System.out.println("ProductB1 的操作"); } } // 具体产品 B2(产品族 2 的 B 类产品) public class