前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >来我们聊聊“简单工厂模式”

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

作者头像
看、未来
发布2020-08-26 10:58:55
3240
发布2020-08-26 10:58:55
举报

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

一个简单的运算类

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

我的入门语言虽然是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的方法

//-、*、/

//返回结果

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一个简单的运算类
  • 紧耦合与松耦合(为什么要用继承?)
  • 简单工厂模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档