上文说了简单工作和工厂方法模式,接下来是抽象工厂模式,比较抽象,难以理解
抽象工厂模式
是指提供一个创建一系列相关或相互依赖对象的接口,无须指定他们具体的类
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂中只有一个或者一组重载的工厂方法。但是有时候我们希望一个工厂可以提供多个产品对象,而不是单一的产品对象,如一个电器工厂,它可以生产电视机、电冰箱、空调等多种电器,而不是只生产某一种电器。为了更好地理解抽象工厂模式,我们先引入两个概念:
(1) 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
(2) 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。
在上图中,不同颜色的多个正方形、圆形和椭圆形分别构成了三个不同的产品等级结构,而相同颜色的正方形、圆形和椭圆形构成了一个产品族,每一个形状对象都位于某个产品族,并属于某个产品等级结构。图中一共有五个产品族,分属于三个不同的产品等级结构。我们只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一确定这个产品。
当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构、属于不同类型的具体产品时就可以使用抽象工厂模式。抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率。
抽象工厂模式示意图
在上图中,每一个具体工厂可以生产属于一个产品族的所有产品,例如生产颜色相同的正方形、圆形和椭圆形,所生产的产品又位于不同的产品等级结构中。如果使用工厂方法模式,图示结构需要提供15个具体工厂,而使用抽象工厂模式只需要提供5个具体工厂,极大减少了系统中类的个数。
适用场景
- 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。
- 强调一系列相关的产品对象(属于同一产品族)一起使用创建对 象需要大量重复的代码。
- 提供一个产品类的库,所有的产品以同样的接口出现,从而使客 户端不依赖于具体实现。
/**
* 一个品牌的抽象工厂
* 要求所有的子工厂都实现这个工厂
*/
public interface ICourseFactory {
//创建课程大纲
ICourse createCoure();
//创建课程视频
IVideo createVideo();
//创建课程笔记
INote createNote();
}
public interface INote {
}
public interface IVideo {
}
public interface ICourse {
}
/**
* 具体的课程笔记
* @author wcj
* @description
* @date 2019/8/16 09:55
*/
public class JavaNote implements INote {
}
/**
* 具体的课程视频
* @author wcj
* @description
* @date 2019/8/16 09:58
*/
public class JavaVIdeo implements IVideo {
}
/**
* 具体的课程大纲
* @author wcj
* @description java学科
* @date 2019/4/9 11:36
*/
public class JavaCourse implements ICourse {
}
/**
* 实现类实现了工厂,去实现自己的具体功能
* @author wcj
* @description
* @date 2019/8/16 09:52
*/
public class JavaFactory implements ICourseFactory {
@Override
public ICourse createCoure() {
return new JavaCourse();
}
@Override
public IVideo createVideo() {
return new JavaVIdeo();
}
@Override
public INote createNote() {
return new JavaNote();
}
}
抽象工厂违背了开闭原则,但是对于扩展还是很强的,适用于修改不那么频繁的产品场景,因为你在接口中加一个产品,那么就得创建多个对应的实现,较为繁琐,但是扩展性较强
抽象工厂的优点
- 具体产品在应用层代码隔离,无须关心创建细节
- 将一个系列的产品族统一到一起创建
抽象工厂的缺点
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品较为困难,需要修改抽象工厂的接口
- 增加了系统的抽象性和理解难度
可以参考此博客,写的非常的好:史上最全设计模式导学目录(完整版)_LoveLion的博客-CSDN博客_csdn 设计模式lovelion