zoukankan      html  css  js  c++  java
  • (转)设计模式 抽象工厂模式

    一、前言

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

    二、定义

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

    三、适用场景

    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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    (转)Linux下/etc/rc.local与/etc/init.d的区别与联系
    (转)谈免驱
    (转)获取android源码时repo的错误
    (转)platform_driver_register,什么时候调用PROBE函数 注册后如何找到驱动匹配的设备
    (转)typedef 函数指针的用法
    (转)分析kernel的initcall函数
    (转)Tiny210v2( S5PV210 ) 平台下 FIMD 对应 的 framebuffer 驱动中,关于 video buffer 的理解
    tiny210V2开发板hdmi输出到10.1寸LCD,无图像
    (转)学习linux的几本书
    (转)RGB接口和i80接口的区别
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/13524022.html
Copyright © 2011-2022 走看看