【GoF 23】篇3:抽象工厂

2023-03-12 09:54:29 浏览数 (1)

1. 什么是抽象工厂?

提供一个创建一系列相关或互相依赖的对象接口,而无需指定它们的具体类。

抽象工厂是一个超级工厂,是其他工厂的工厂,或将简单工厂进一步抽象。

这样来理解: 我们将科技公司可以做的事情简要枚举出来,生产手机、电脑、路由器等等,比如小米、华为、联想等公司都可以生产这些产品。

这里,我们就可以将科技公司可以生产的产品全部在一个接口中枚举出来,这个接口就可以看作一个抽象工厂。而小米、华为、联想这些公司就是普通工厂。抽象工厂将普通工厂可以生产的产品进行抽象出来。

这里有两个概念:产品簇、产品级

  • 产品簇:或许称之为“产品系”会更便于理解,比如小米生产的手机、电脑都是小米系列的,这就是一个产品簇。
  • 产品级:或许称之为“产品类”会更便于理解,手机和手机就是一个产品级,它们都是同一类商品,都是手机。

2. 代码示例

  1. 定义普通工厂的抽象工厂
代码语言:javascript复制
// 抽象工厂,抽象方法为科技公司可以生产的产品
public interface ProductFactory {

	// 可以生产手机,产品簇
	PhoneProduct phoneProduct();
	// 可以生产电脑,产品簇
	ComputerProduct computerProduct();

}
  1. 定义普通手机工厂
代码语言:javascript复制
// 产品级
public interface PhoneFactory { ... }
  1. 定义普通电脑工厂
代码语言:javascript复制
// 产品级
public interface ComputerFactory { ... }
  1. 定义小米生产手机
代码语言:javascript复制
public class XiaoMiPhone implements PhoneFactory{ ... }
  1. 定义小米生产电脑
代码语言:javascript复制
public class XiaoMiComputer implements ComputeFactory{ ... }
  1. 定义小米工厂,在这里实现抽象工厂
代码语言:javascript复制
// 小米工厂要实现抽象工厂,抽象工厂就是将工厂可以做的事情抽象出来,具体行为由子工厂去定义
// 其实这里就是一个简单工厂,所以抽象工厂就是对简单工厂的抽象
public class XiaoMiFactory implements ProductFactory {
	// 小米可以生产手机
	public PhoneProduct phoneProduct(){
		return new XiaoMiPhone();// 在这里创建对象,但是具体行为在子类中
	}
	// 小米可以生产电脑
	public XiaoMiComputer xiaoMiComputer(){
		return new XiaoMiComputer();
	}
}
  1. 客户端
代码语言:javascript复制
XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
xiaoMiFactory.phoneProduct();//创建手机的实例
xiaoMiFactory.xiaoMiComputer()//创建电脑的实例

3. 小结

抽象工厂的本质就是:选择产品簇的实现。

0 人点赞