百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

ABAP面向对象之工厂模式(Factory Pattern)

liebian365 2024-10-21 08:47 22 浏览 0 评论

概述

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

介绍

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

解决的问题

主要是解决接口选择的问题。

何时使用:

我们明确地计划在不同条件下创建不同实例时

如何解决:

让其子类实现工厂接口,返回的也是一个抽象的产品。

应用实例:

  1. 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
  2. Hibernate 换数据库只需换方言和驱动就可以。

优点:

  1. 一个调用者想创建一个对象,只要知道其名称就可以了。
  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  3. 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

使用场景:

  1. 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
  2. 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
  3. 设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。

实现

我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。

FactoryPatternDemo,我们的演示类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。

  1. 创建接口


INTERFACE  if_shape .
  METHODS draw.
ENDINTERFACE.


  1. 实现接口的实体类

矩形

CLASS cl_rectangle DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_shape.
    ALIASES draw FOR if_shape~draw.
ENDCLASS.


CLASS cl_rectangle IMPLEMENTATION.
  METHOD draw.
    WRITE:/ 'Inside cl_rectangle->draw() method.'.
  ENDMETHOD.
ENDCLASS.


方形


CLASS cl_square  DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_shape.
    ALIASES draw FOR if_shape~draw.
ENDCLASS.


CLASS cl_square IMPLEMENTATION.
  METHOD draw.
    WRITE:/ 'Inside cl_square->draw() method.'.
  ENDMETHOD.
ENDCLASS.


圆形


CLASS cl_circle  DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_shape.
    ALIASES draw FOR if_shape~draw.
ENDCLASS.


CLASS cl_circle IMPLEMENTATION.
  METHOD draw.
    WRITE:/ 'Inside cl_circle->draw() method.'.
  ENDMETHOD.
ENDCLASS.
  1. 创建工厂类,,返回基于给定信息的实体类的对象。


CLASS cl_shape_factory  DEFINITION.
  PUBLIC SECTION.
    METHODS:  get_shape
      IMPORTING
                iv_shape_type      TYPE string
      RETURNING VALUE(ro_instance) TYPE REF TO if_shape.
ENDCLASS.


CLASS cl_shape_factory IMPLEMENTATION.
  METHOD get_shape .
    CASE to_upper( iv_shape_type ).
      WHEN 'CIRCLE'.
        ro_instance = NEW cl_circle( ).
      WHEN 'RECTANGLE'.
        ro_instance = NEW cl_rectangle( ).
      WHEN  'SQUARE'.
        ro_instance = NEW cl_square( ).
      WHEN OTHERS.
    ENDCASE.
  ENDMETHOD.
ENDCLASS.
  1. 使用该工厂,通过传递类型信息来获取实体类的对象。


CLASS cl_application DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:  run .
ENDCLASS.


CLASS cl_application IMPLEMENTATION.
  METHOD run.


    DATA(lo_shape_factory) = NEW cl_shape_factory( ).


    "获取 Circle 的对象,并调用它的 draw 方法
    DATA(lo_shape1) = lo_shape_factory->get_shape( 'CIRCLE' ).


    " 调用 Circle 的 draw 方法
    lo_shape1->draw( ).


    "获取 Rectangle 的对象,并调用它的 draw 方法
    DATA(lo_shape2)  = lo_shape_factory->get_shape( 'RECTANGLE').


    "调用 Rectangle 的 draw 方法
    lo_shape2->draw( ).


    "获取 Square 的对象,并调用它的 draw 方法
    DATA(lo_shape3)  = lo_shape_factory->get_shape( 'SQUARE').


    "调用 Square 的 draw 方法
    lo_shape3->draw( ).
  ENDMETHOD.
ENDCLASS.


START-OF-SELECTION.
  cl_application=>run(  ).

实现的UML

SAP 生成UML

由于不完整,这里重新画了UML

  1. 验证结果:


相关推荐

记录一个ComboBox的设置问题,你可能没遇到过

ComboBox这个控件使用频率太高了,我从VC6编程开始就用它,一直用到C#到现在的Net6,要说我这么一个编程老手还能在它身上栽跟头,我都不敢相信。但是今天竟然被它无情的戏耍了。记录下这个问题,看...

组合框(Combo Box)应用之一_combo简单组合框

【分享成果,随喜正能量】对别人期待太高,本质上是对自身无能的逃避和推托,与其期待别人,不如依靠自己。你不害怕孤独,就不再寄期望于他人陪伴;你有底气解决问题,就不在寄期望于他人向你伸出援手。一个人期待值...

Qt之QComboBox定制(二)_qt on_combobox_activated

上一篇文章Qt之QComboBox定制讲到了qt实现自定义的下拉框,该篇文章主要实现了列表式的下拉框,这一节我还将继续讲解QComboBox的定制,而这一节我将会讲述更高级的用法,不仅仅是下拉列表框,...

从零开始系列,用C#做软件产品:私人日记(九)ComboBox入门

第八节的内容早已写好发布,结果一直在审核中,不知道触动了哪条神经。评论中看到有一些网友都在问为什么不用WPF来开发,在这里我统一说明下:1)WPF界面设计相对复杂。由于它是矢量的,需要额外有很多容器做...

QT-QSharedMemory_qt450-10是什么材料

1.QSharedMemory介绍...

进入Python的世界19-pyqt6不只是UI设计,其他模块功能如何运用

今天是大年初四,继续探讨pyqt6,给出使用的建议。PyQt6绝不仅仅局限于UI设计...

从零开始学Qt - 10:一文读懂Qt的元对象系统

Qt本身并不是一种编程语言,它实质上是一个跨平台的C++开发类库。它是用标准C++编写的,为开发GUI应用程序和非GUI应用程序提供了各种类。Qt对标准C++进行了扩展,引入一些新的概念和功能,例如信...

QT实现抖动文字和滚动文字,附源码

前言不知道大家有没有发现今天的文章有什么不一样,哈哈,我自己胡拼乱凑弄了一个logo,好不好看就先不说了,最起码萌萌哒...当然这不是今天的重点,在做logo的时候,我原本想让文字动起来的,奈何技术有...

Qt Concurrent的使用_qt是什么意思

1.简介QtConcurrent命名空间提供了高级api,使得无需使用诸如互斥、读写锁、等待条件或信号量等低级线程原语就可以编写多线程程序。使用QtConcurrent编写的程序会根据可用的...

Qt使用FFmpeg播放视频_qt使用ffmpeg播放视频功能

一、使用场景...

Qt中使用匿名函数lambda表达式_匿名函数lambda

一、为什么要使用匿名函数lamdba首先,lambda表达式可以使代码变得简单,C++中,一个lambda表达式表示一个可调用的代码单元。如代码:...

EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工

今天,正运动小助手给大家分享一下EtherCAT运动控制卡开发教程之Qt,主要介绍一下如何通过Qt编程实现小线段轨迹连续加工,暂停与继续。...

送亲人,用1小时制作精美电子相框 | Qt 示例

今天给大家分享:...

Python之面向对象:综合应用,基于GUI实现会动的游戏英雄

引言本打算以上一篇文章作为面向对象模块的收尾,但是,犹豫了许久,还是决定再补充一篇,也就是今天这篇文章,打算基于Python的PyQt6/PySide6框架开发一个GUI程序,模拟实现一个在电脑桌面活...

Qt——常用数据类型_qt基本数据类型

1.基础类型因为Qt是一个C++框架,因此C++中所有的语法和数据类型在Qt中都是被支持的,但是Qt中也定义了一些属于自己的数据类型,下边给大家介绍一下这些基础的数类型。...

取消回复欢迎 发表评论: