1. 概述
抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
顾名思义,抽象工厂模式肯定和工厂模式有什么关系,实际上它是工厂模式的一种变种,它的核心内容和工厂模式差不多,都是实现了创建对象的解耦,不了解工厂模式的小伙伴可以看我写的这篇博客:工厂模式
抽象工厂模式和工厂模式的不同点就在于它们针对的对象不一样,工厂模式针对的是位于同一产品等级的情况,抽象工厂模式则是同时针对产品等级和产品族的情况。
什么是产品等级和产品族?这样说可能有点抽象,举个例子吧:比如现在的高科技产品,手机呀、路由器呀,那手机就有小米手机、华为手机,它们都是手机所以是同一产品等级,那小米公司里有手机和路由器,所以小米手机和小米路由器就位于同一产品族,看个图:
如果你了解了工厂模式,那你肯定很清楚工厂模式能处理同一产品等级的情况,但是现在如果要考虑产品族,那就必须使用抽象工厂模式了。抽象工厂有啥用呢?它的作用和工厂模式一样,实现了创建对象过程的解耦,无需关心确切的类,同时具有很好的可扩展性,而且逻辑很清晰。
我们再举个例子说明下:这次不举高科技产品了,用我们的家具来说明下。现在有三种家具:椅子、沙发、咖啡桌,家具有三种风格:现代、装饰风、维多利亚。三种风格就是三种产品族,三种家具种类就是三个产品等级。
同一产品等级就是有实际上的联系的产品,比如椅子,虽然它们有不同的风格,但他们都是椅子,都是给人坐的。这种在代码中表现为实现同一个接口或者抽象方法。
同一产品族就是一种逻辑上有联系的产品,这种有点难说明,但大家应该可以意会到,在实际世界中表现为同一品牌、同一风格、同一种类等。
OK举例完毕,问题来了,首先还是工厂模式里的两个问题,但是现在工厂模式不适用这种情况:第一个,假如类的构建过程很复杂,在客户端中直接new很麻烦该怎么办?第二个,假如现在要加入一种新的家具种类,比如加入电竞椅,三种风格都要有,这个时候代码该怎么设计才具有良好的可扩展性呢?看下面具体实现。
所以总结一下:
- 抽象工厂是工厂模式的变种,所以具有工厂模式相同的优缺点:都实现了对象的解耦,具有良好的可扩展性,无需关心确切类的信息
- 抽象工厂和工厂模式的适用场景不同,工厂模式只针对同一产品种类,抽象工厂针对产品种类和产品族的情况。
2. 特点
这里来点抽象的概念了,其实假如你已经吃透了工厂模式,这里就不用怎么看了,内容都差不多:
-
优点
- 你可以确保同一工厂生成的产品相互匹配。
- 你可以避免客户端和具体产品代码的耦合。
- 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
- 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。
-
缺点
- 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。
-
适用场景
-
如果有一个基于一组抽象方法的类, 且其主要功能因此变得不明确, 那么在这种情况下可以考虑使用抽象工厂模式。
在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。
-
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。
抽象工厂为你提供了一个接口, 可用于创建每个系列产品的对象。 只要代码通过该接口创建对象, 那么你就不会生成与应用程序已生成的产品类型不一致的产品
-
3. Java实现
下面开始具体的代码编写了,代码的编写将会按照上面的家具的例子,为了节省代码,将会只写到了椅子、沙发这两种家具,现代和装饰风这两种风格。
-
UML类图
-
Java代码
/** * @Author: chy * @Description: 椅子 *