专栏首页CSDN搜“看,未来”来我们聊聊“简单工厂模式”

来我们聊聊“简单工厂模式”

如有雷同,纯属我借鉴的。 以下代码,没什么特殊情况就是伪代码了。

一个简单的运算类

现在需要你实现一个计算器功能,你会怎么搞,第一反应,可以先去纸上写写伪代码,不急着往下看。

我的入门语言虽然是C++,但是在学校并没有学到C++的精髓。我现在在这边提问C++的精髓是什么,可能有的小伙伴还是回答不上来。

C++是一门面向对象的编程语言,具有封装性、继承性、多态性“三座大山”。代码复用性强、拓展性好、容易维护是C++的优势。

初学的我,对上面说的那个计算器的功能,我是会这样想的:

//接收两个数的输入

//接收符号的输入

//根据符号进行判断并输出

//异常处理

当然,对于初学者来说这样是无可厚非的了。

那这时候再加个要求,用MFC(我们当时的课程设计)做一款计算机呢?我印象深刻,当时我坚决不开外挂,然后果然挂科了。好,现在要加上页面设计,怎么搞?上面的代码重头写过,这样:

//设计好界面按键

//以按键点击代替键盘输入

//将结果返回到文本框

//异常处理

上面这两个代码设计虽然看起来有着千丝万缕的联系,但是其实第一个代码根本是一点没用,第二串代码就是重头来过,完全看不到一点代码复用性。

当然,对于当时的我写成那样无可厚非,初学者嘛。

这时,封装性就要上场了。编程有一个原则,就是尽量精简,减少重复代码。代码的繁简直接影响代码的质量,判若云泥。 对于上面那个需求,是否可以想一下,那些部分是属于UI界面,而哪些部分又是属于逻辑计算层面呢?

将逻辑业务与界面UI分开,就需要分别封装相关函数。

那么这时候上面那个函数就可以这样分:

class A_UI
{
	//UI控制台
};

class B_calculate
{
	//加
	//减
	//乘
	//除
	//输出
};

紧耦合与松耦合(为什么要用继承?)

这个问题,可能有些经验的朋友会觉得是个废话,天天都在用你跟我说为什么要用?我,我哪儿知道,用习惯了呗。为了让代码更有层次感?为了让每个类更精简?

那这样想一下,刚刚那个运算类,现在要你加进去一个开根号的功能、 一个乘方功能、一个阶乘功能,你会怎么想?

第一想法就是在原有类上直接添加嘛,UI层面加到UI里面,逻辑运算层面加到逻辑运算的类里面。 但是这样真的好吗?把原始的类直接交给你基本是不可能的,你自己写个代码玩玩还可以。要是你不小心把原始的加法运算给改成减法运算了呢?要是这个是你们公司计算工资的运算器呢是吧。

现在这个类改成这样:

class Cal_Base	//运算基类
{
	//输出结果(虚函数)
}

class Add :public Cal_Base
{
	//加
}

//Sub、Mul、Div等类我就不写了

简单工厂模式

千呼万唤始出来啊。

现在就该考虑如何使用这些类来进行运算了。当然可以直接声明子类对象,但是子类是不互通的,如果使用子类对象就意味着用一种功能需要一个对象,那就很麻烦的。

所以我们使用父类对象,去显式调用子类实现的虚函数。

那么我们就面临一个问题了,如何去初始化那个父类实例呢?要知道这个父类可是有n个子类的啊。

这时候,就需要使用简单工厂模式了。

Cal_Base base;

//判断符号

//+
//调用Add的方法

//-、*、/

//返回结果

只需要输入运算符号,工厂就实例化相应的合适对象,调用相应函数。

如果有一天我们需要就该其中某个运算,只需要修改相应部分就可以。 如果要新增功能,只需要加个子类,然后在工厂里面加个判断就好了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 线性回归分析

    残差正态性的频率检验是一种很直观的检验方法,其基本思想是将残差落在某范围的频率与正态分布在该范围的概率相比较,通过二者之间偏差大小评估残差的正态性。

    看、未来
  • 文件I/O

    有一定编程基础的小伙伴应该都接触过文件编程吧,file. 在C语言里面是包一个<file.h>的头

    看、未来
  • 操作系统(五)虚拟存储器管理

    一次性和驻留性严重地降低内存的利用率,显著地减少了系统吞吐量。 研究表明,程序在执行过程中呈现局部性原理。

    看、未来
  • 传统企业c++程序员想转互联网企业,项目经验不对应,转的过去吗?

    从就业形势上看现在互联网的薪资相对高一些,对于编程语言来讲不会区分是不是传统企业还是互联网企业,C++属于资深类型的编程语言需要经历过几年的项目磨炼,国内的互联...

    程序员互动联盟
  • Java基础笔记整理---【09】面向对象程序设计-上转型对象

    1.上转型对象:父类声明,子类实例化的对象叫做上转型对象 2.上转型对象使用规则: 1.上转对象不能操作子类新增的成员变量,失掉了这部分属性,不能使用子...

    李志伟
  • Python异常处理 -跳过异常继续执行

    py3study
  • 面试时,如何在1分钟内让面试官记住自己?

    程序工场
  • 提高万恶的KPI,切忌要避开这六个低效的编程习惯

    我们都会有好习惯和坏习惯,编程习惯也不例外。但是一旦你开始意识到自己的不良习惯,你就可以改变,并让自己更好。如果你要打破此列表中的这些不良习惯之一,它不仅仅能影...

    程序员小跃
  • 用Java为Hyperledger Fabric(超级账本)开发区块链链代码智能合约之编写链代码程序

    在上一节中,您已经熟悉了如何构建、运行、部署和调用链代码,但尚未编写任何 Java 代码。

    笔阁
  • 2. Pandas系列 - Series基本功能

    计算广告生态

扫码关注云+社区

领取腾讯云代金券