1. 什么是抽象工厂?
提供一个创建一系列相关或互相依赖的对象接口,而无需指定它们的具体类。
抽象工厂是一个超级工厂,是其他工厂的工厂,或将简单工厂进一步抽象。
这样来理解: 我们将科技公司可以做的事情简要枚举出来,生产手机、电脑、路由器等等,比如小米、华为、联想等公司都可以生产这些产品。
这里,我们就可以将科技公司可以生产的产品全部在一个接口中枚举出来,这个接口就可以看作一个抽象工厂。而小米、华为、联想这些公司就是普通工厂。抽象工厂将普通工厂可以生产的产品进行抽象出来。
这里有两个概念:产品簇、产品级
- 产品簇:或许称之为“产品系”会更便于理解,比如小米生产的手机、电脑都是小米系列的,这就是一个产品簇。
- 产品级:或许称之为“产品类”会更便于理解,手机和手机就是一个产品级,它们都是同一类商品,都是手机。
2. 代码示例
- 定义普通工厂的抽象工厂
// 抽象工厂,抽象方法为科技公司可以生产的产品
public interface ProductFactory {
// 可以生产手机,产品簇
PhoneProduct phoneProduct();
// 可以生产电脑,产品簇
ComputerProduct computerProduct();
}
- 定义普通手机工厂
// 产品级
public interface PhoneFactory { ... }
- 定义普通电脑工厂
// 产品级
public interface ComputerFactory { ... }
- 定义小米生产手机
public class XiaoMiPhone implements PhoneFactory{ ... }
- 定义小米生产电脑
public class XiaoMiComputer implements ComputeFactory{ ... }
- 定义小米工厂,在这里实现抽象工厂
// 小米工厂要实现抽象工厂,抽象工厂就是将工厂可以做的事情抽象出来,具体行为由子工厂去定义
// 其实这里就是一个简单工厂,所以抽象工厂就是对简单工厂的抽象
public class XiaoMiFactory implements ProductFactory {
// 小米可以生产手机
public PhoneProduct phoneProduct(){
return new XiaoMiPhone();// 在这里创建对象,但是具体行为在子类中
}
// 小米可以生产电脑
public XiaoMiComputer xiaoMiComputer(){
return new XiaoMiComputer();
}
}
- 客户端
XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
xiaoMiFactory.phoneProduct();//创建手机的实例
xiaoMiFactory.xiaoMiComputer()//创建电脑的实例
3. 小结
抽象工厂的本质就是:选择产品簇的实现。