工厂模式

一、 前言

1.1 为什么学习设计模式

学习编程的人一定会听过设计模式,第一次听到这个词的时候感觉非常高大上,也在网络上搜索阅读过一些设计模式,但都零零散散不够系统,只能片面地了解设计模式,因此决定完整的阅读学习传说中的设计模式,同时开始通过博客来记录巩固每次的学习成果,也方便以后对相关知识点的回顾整理。

1.2 工厂模式简介

工厂模式主要分为以下三类:

  1. 简单工厂模式
  2. 工厂方法模式
  3. 抽象工厂模式

因此本文将分别介绍这三种模式,并说明各个工厂模式的定义、优缺点以及适用场景等。

二、 三种工厂模式

2.1 简单工厂模式

2.1.1 定义

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

2.1.2 类型

由于不属于23种设计模式之一,因此无分类,可视作创建型模式

2.1.3 UML

下图截取自程杰的《大话设计模式》
简单工厂模式UML图

2.1.4 优点

  • 工厂类能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的,封装性较好。

2.1.5 缺点

  • 由于工厂类集中了所有实例的创建逻辑,当系统中的具体产品类不断增多时,会出现要求工厂类也要做相应修改的情况,扩展性不好。

2.1.6 适用场景

  • 适用于较为简单的不变化的系统中,如果结合反射机制则可以适应与更多的场景中。

2.1.7 小结

简单工厂模式封装了对象的创建过程,对用户而言只需要输入名称或相关参数即可得到对应的产品,但由于在实际生活中,需求的变化总是多种多样的,简单工厂模式并能适应不断变化的需求,因此不太实用此模式。

2.2 工厂方法模式

2.2.1 定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

2.2.2 类型

创建型模式

2.2.3 UML

下图截取自程杰的《大话设计模式》
工厂方法模式UML图

2.2.4 优点

  • 克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。

2.2.5 缺点

  • 每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。

2.2.6 适用场景

  • 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
  • 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。

2.2.7 小结

工厂方法模式相对于简单工厂模式进行了进一步封装与抽象,遵循了开放-封闭原则,能够动态地修改具体工厂类以生产更多种类的产品,已基本满足普通需求,但对于一个产品系列的生成仍需创建多种工厂,较为麻烦,因此对于涉及产品族的生成,应使用接下来的抽象工厂模式。

2.3 抽象工厂模式

2.3.1 定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体的类。

2.3.2 类型

创建型模式

2.3.3 UML

下图截取自程杰的《大话设计模式》
抽象工厂模式UML图

2.3.4 优点

  • 易于交换产品系列,当需要更换产品族的时候只需要修改实例化具体工厂的部分,即可对整体的产品进行替换。
  • 让具体的创建实例与客户端分离,客户端通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

2.3.5 缺点

  • 当增加功能的时候,所有涉及的工厂接口、具体工厂类、产品接口、具体产品类都需要修改,当产品或工厂较多的时候维护成本很高。

2.3.6 适用场景

  • 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品,且同属于同一个产品族是在一起使用的情况,如使用Unix与Windows系统时,只会同时使用一种系统。

2.3.7 小结

抽象工厂模式为三种工厂模式中抽象程度最高的模式,其实和工厂方法模式基本可以认为相同,只是在同一工厂中抽象工厂模式具有多个方法分别对应于每个具体的产品,即可以做到一处修改,各处都跟着改变的效果。同时带来的问题在于纵向扩展性不加,但这种修改是无法避免的,所以抽象工厂模式仍是一种非常好的模式。

三、 总结

从简单工厂模式到工厂方法模式再到抽象工厂模式,封装与抽象的程度逐渐提高。在简单工厂模式中,仅仅对产品对象进行了抽象处理,工厂对象只是作为创建工具简单解析客户端的输入来判断该创建何种产品;在工厂方法模式中,不仅对产品抽象,同时也对工厂进行了抽象处理,同一种产品的不同实现分别对应于具体的工厂,而将创建工厂的决定权交给客户端,客户端通过创建不同的工厂来生成对应的产品;在抽象工厂模式中,对于产品一端,考虑到产品不仅仅有实现的不同,同时还有种类的千差万别,而如果每个工厂仅生产一种产品则会造成类的数量激增,同时与现实生活中的产品族概念相对应,将一系列产品的生产权交给同一工厂,使变换产品族更加方便。
  在三种工厂模式中,并不存在孰优孰劣,而应该针对具体的实际情况来判断使用何种模式,不然可能画蛇添足,弄巧成拙,带来不必要的麻烦。

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值