前言

上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用。

工厂模式概述

工厂模式属于创建型模式,它是面向对象实例化时候的一种最佳方式。在这种模式中,我们创建对象不会对客户端暴露创建逻辑,通过一个共同的接口来指向新创建的对象。

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

工厂模式分类

工厂模式种类分为三类:
1. 简单工厂模式
2. 工厂方法模式
3. 抽象工厂模式

上述模式从上到下逐步抽象,GOF在《设计模式》中将简单工厂归为工厂方法的简化版本,而实际使用中,尤其是LabVIEW程序开发,简单工厂模式更加容易理解和应用,所以本文以简单工厂模式介绍,后续文章在逐渐分析其他模式。

简单工厂模式

简单工厂主要由3部分组成:

1.工厂类角色:这是本模式的核心,是一组控制逻辑(LabVIEW中此处可以不以类的形式出现)
2.抽象产品角色:它一般用来定义产品的特性
3.具体产品角色:用来具体做某些事情

下图为简单工厂的UML


 

其中:

   Abstract Product  为抽象的产品,用来定义产品的特性
   Product1-3            分别继承Abstract Product的特性和方法,将具体的执行下放到子类中
   Creator                  起到了工厂类的作用,用于指定生成产品的方法和逻辑

LabVIEW中的简单工厂

为什么用简单工厂模式
简单工厂应用于小黑的LabVIEW程序编写起源于一个客户需求。在项目进行中,客户要求使用一套统一的API去控制不同种类的的电源设备,而这些电源种类各异,指令各不相同。如果是传统的LabVIEW编程,你会如何做呢?

在面向过程的程序编写中,我们往往会设计顶层的子VI,然后使用Case结构,将类似的VISA控制指令写入多个VI
  
这种写法在无设备拓展性要求时,可以很快Cover用户需求,但客户一旦增加一种设备的驱动,则需要增加自定义枚举,并且在每一个方法中修改Case结构。这种写法可以完成目的,但是将多个驱动耦合到一起,无论是增加,删除,还是单独调试都非常不便。
 
此时,使用简单工厂模式即可快速解决传统写法的不足,既可以实现快速的拓展,也可以实现不同驱动的解耦。在面向对象程序设计时,第一步进行UML图绘制
 
抽象类 Abstract Power用于定义客户需要的通用接口,在与客户讨论的时候,你可以重点关系客户需要如何使用这些API,需要哪些控制参数,而完全不必了解具体哪个电源如何实现。

当设计某一个电源的控制方法时,可以继承父类,并且直接重写各个需要的方法,而不必关心要给客户留哪些接口。
 
在调用这些API的时候,统一使用抽象的接口,通过枚举或者其他方法控制初始化执行哪个子类。通过这种程序设计,将产品的实际执行下放到类子类中。
如果需要拓展驱动(如这里创建了一个TestPower),可以直接继承并且重写方法,由父类直接获得所有接口和设计
 
驱动完成拓展后,主程序基本不进行改动
 
在初始化驱动的时候,增加选择器,根据配置初始化不同的驱动即可

LabVIEW报表工具包

LabVIEW其实已经给出了简单工厂模式的一个最佳范例,它就是LabVIEW的报表生成工具包
报表工具包的顶层给出了一些通用的报表功能,如初始化,打印报表,保存报表,通过工厂模式,设计抽象的产品NI Report来定义报表创建过程中常用到的功能

 
在LabVIEW中可以通过LabVIEW Class Hierarchy打开类图,观察类的继承关系,如下图所示

在初始化的工厂中(这里是最上层的API),通过枚举来控制初始化不同的驱动

如果后续拓展报表工具包的代码,同样只需要继承父类的方法,然后修改初始化的Case即可
 后记
上文的分析可以看出,简单工厂模式的引入为代码的可拓展性提供的更好的解决方法,这种模式是面向对象程序设计中最基本的设计模式,也是LabVIEW设计中最应当掌握的初级模式。

如果上文对您有所帮助,或有不当的地方,可留言探讨。忙碌工作之余,码字不易,期待大家的互动与鼓励~

 




【LabVIEW技巧】工厂模式_简单工厂的更多相关文章

  1. Java学习笔记——Java工厂模式之简单工厂

    package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...

  2. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  4. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  5. 设计模式之工厂模式之简单工厂(php实现)

    github源码地址: git@github.com:ZQCard/design_pattern.git 1.简单工厂模式 特点:将调用者与创建者分离,调用者直接向工厂请求,减少代码的耦合.提高系统的 ...

  6. Objective-C 工厂模式(上) -- 简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...

  7. factory工厂模式之简单工厂SimpleFactory

    简单工厂(Simple Factory) 又叫静态工厂,是工厂模式三中状态中结构最为简单的.1.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.2.或者针对每个产品, ...

  8. c# 设计模式 之:工厂模式之---简单工厂

    1.uml类图如下: 具体实现和依赖关系: 实现:SportCar.JeepCar.HatchbackCar 实现 Icar接口 依赖: Factory依赖 SportCar.JeepCar.Hatc ...

  9. JAVA 工厂模式:简单工厂

    简单工厂模式(SimpleFactory Pattern): 又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的 ...

随机推荐

  1. BZOJ4289 PA2012Tax(最短路)

    一个暴力的做法是把边看成点,之间的边权为两边的较大权值,最短路即可.但这样显然会被菊花图之类的卡掉. 考虑优化建图.将边拆成两个有向边,同样化边为点.原图中同一条边在新图中的两个点之间连边权为原边权的 ...

  2. Oracle-RAC原理

    Oracle-RAC原理 来源 https://blog.csdn.net/qq_34556414/article/details/79001267 单点数据库 VS RAC 单节点数据库,如果实例宕 ...

  3. (转) Parameter estimation for text analysis 暨LDA学习小结

    Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...

  4. [洛谷P3224][HNOI2012]永无乡

    题目大意:给你$n$个点,每个点有权值$k$,现有两种操作: 1. $B\;x\;y:$将$x,y$所在联通块合并2. $Q\;x\;k:$查询第$x$个点所在联通块权值第$k$小是哪个数 题解:线段 ...

  5. POJ1269:Intersecting Lines——题解

    http://poj.org/problem?id=1269 题目大意:给四个点,求前两个点所构成的直线和后两个点所构成的直线的位置关系(平行,重合,相交),如果是相交,输出交点坐标. ——————— ...

  6. 两年Java的面试经验

    前言:从过年前就萌生出要跳槽的想法,到过年来公司从3月初提出离职到23号正式离职,上班的时间也出去面试过几家公司,后来总觉的在职找工作总是得请假,便决心离职后找工作.到4月10号找到了一家互联网公司成 ...

  7. Chromedriver 的安装与配置

    首先是下载网址:https://sites.google.com/a/chromium.org/chromedriver/downloads(需要FQ,用Browser浏览器即可翻进,版本要和Chro ...

  8. [LeetCode][Facebook面试题] 通配符匹配和正则表达式匹配,题 Wildcard Matching

    开篇 通常的匹配分为两类,一种是正则表达式匹配,pattern包含一些关键字,比如'*'的用法是紧跟在pattern的某个字符后,表示这个字符可以出现任意多次(包括0次). 另一种是通配符匹配,我们在 ...

  9. EasyUI Tree递归方式获取JSON

    最近需要用到EASYUI中的TREE功能,以前我是直接拼接成<UL><LI>发现这样拼完之后在更改树后对树的刷新不是很理想,现改用JSON格式,首先分析TREE中JOSN格式如 ...

  10. Spring @Async的异常处理

    楼主在前面的2篇文章中,分别介绍了Java子线程中通用的异常处理,以及Spring web应用中的异常处理.链接如下: Java子线程中的异常处理(通用) Spring web引用中的异常处理 今天, ...