1.定义
抽象工厂模式也是一种创建型模型,是对工厂的一种抽象,可以理解为生产工厂的工厂。不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品。
例如手机和电脑都是通过工厂进行生产的,同时手机和电脑可能属于不同的工厂,但可能是同一个品牌;小米手机和小米电脑属于同一品牌,而华为手机和电脑也属于同一品牌,但是却存在两个维度。
1,产品维度,无论小米手机还是华为手机都属于手机,无论小米电脑还是华为电脑都属于电脑。
2.公司维度,小米手机和小米电脑属于小米公司,而华为手机和华为电脑都属于华为公司。
2.抽象工厂结构图
其中Factory扮演工厂的抽象角色,而Factory1和Fatcory2是具体的工厂角色负责生产。同时ProductA扮演产品的抽象角色,而ProductA1、ProductA2则扮演的是具体的产品角色,是被具体的工厂进行生产的。
3.抽象工厂代码实现
ProductFactory就是工厂的抽象角色,他并不知道产品该怎么被生产,所以只是规定了能够生产哪些产品,比如电脑产品和手机产品。
有了工厂我们需要产品,毕竟工厂要负责生产产品,我们有两个产品分别是手机和电脑,但是他们只是一个抽象的产品,只是定义了自己所能拥有的功能。
产品只是定义了抽象的行为,是需要具体的产品进行完善的,比如小米手机和小米电脑以及华为手机和华为电脑,从产品来说手机都属于抽象手机的具体产品,电脑都属于抽象电脑产品的具体产品。所以手机都应该实现PhoneProduct而电脑都应该实现ComputerProduct。
现在有了具体的产品,但是产品是需要被工厂所生产的吧,而同一个品牌应该被同一个工厂所生产,小米的手机和电脑都应该被小米工厂生产,而华为的手机和电脑都应该被华为工厂生产。只是他们可能不在一个流水线,实际上在同一品牌应该都是同一个工厂。
所以XiaoMiFatcory和HuaWeiFatcory就是不同产品的工厂,他们是工厂抽象的具体实现,所以应该实现ProdyctFactory。同时需要对电脑和手机进行不同的生产,所以创建了不同的产品。
下面进行测试,我们生产一个华为电脑进行开机和打游戏,然后生产一个小米手机开机和打电话。可以看到实际上我们使用华为工厂进行了华为的电脑生产,用小米的工厂生产了小米手机。但是他们并不是同一个工厂,且从产品维度属于同一个产品,从同一个品牌维度又属于同一个品牌。
抽象工厂模式优缺点:
优点:抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
缺点:产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
小结:抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交。本文参考B站《狂神说》以及廖雪峰的官网