(转)设计模式 抽象工厂模式

一、前言

抽象工厂模式,创建型设计模式之一。抽象工厂起源于以前对不同操作系统的图形化解决方案,如不同操作系统中的按钮和文本框控件其实现不同,展示效果也不一样,对于每一个操作系统,其本身就构成一个产品类,而按钮和文本框控件也构成一个产品类,两种产品类两种变化,各自有自己的特性。

二、定义

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。

三、适用场景

1、客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
2、强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
3、提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

为了更好理解产品等级结构与产品族,我们看两张图,
 
屏幕快照 2019-04-24 下午6.53.25.png
 
屏幕快照 2019-04-24 下午6.53.50.png

横着一行是一个产品族,竖着一列是一个产品等级结构。

还用上篇文章工厂方法模式中例子,现在不仅要录视频还要手记,如Java手记、Python手记等,要是按照工厂模式,需要创建Java手记类、python手记类、Java手记工厂、python 手记工厂、手记工厂类,很容易发生类爆炸情况。其中Java视频、python 视频是一个产品等级都是视频,Java手记、python手记又是一个产品等级,Java视频和Java手记是同一产品族。

四、代码实战

首先创建Java产品族的视频和手记类,还有Java产品工厂,

 
屏幕快照 2019-04-23 下午5.06.55.png
 
屏幕快照 2019-04-23 下午5.12.01.png
 
屏幕快照 2019-04-23 下午5.07.13.png
 
屏幕快照 2019-04-23 下午5.07.31.png
 
屏幕快照 2019-04-23 下午5.08.21.png
然后创建python产品族的视频和手记,还有手记工厂,
 
屏幕快照 2019-04-23 下午5.10.52.png
 
屏幕快照 2019-04-23 下午5.11.01.png
 
屏幕快照 2019-04-24 下午7.12.59.png

再然后创建工厂,
 
屏幕快照 2019-04-23 下午5.13.09.png
测试,
 
屏幕快照 2019-04-23 下午5.13.52.png
虽然抽象工厂方法模式的类比较多,但是,主要分为4类。
AbstractFactory:抽象工厂角色,如CourseFactory类,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品,如创建视频和创建手记。
ConcreteFactory:具体工厂角色,如JavaCourseFactory和PythonCourseFactory类,它实现了在抽象工厂中定义的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
AbstractProduce:抽象产品角色,如Video和Article类,它为每种产品声明接口。
ConcreteProduce:具体产品角色,如JavaVideo、JavaArticle、PythonVideo和PythonArticle类,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

五、总结

1、优点

(1)具体产品在应用层代码隔离,无须关心创建细节
(2)将一系列的产品族统一到一起创建

2、缺点

(1)规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
(2)增加了系统的抽象性和理解难度



作者:南小夕
链接:https://www.jianshu.com/p/7a56b7bafbb9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/wangle1001986/p/13524022.html