(一)简单工厂模式

发布时间:2026/9/22 9:54:01
(一)简单工厂模式 实例化对象的时候不再使用 new Object()形式可以根据用户的选择条件来实例化相关的类。对于客户端来说去除了具体的类的依赖。只需要给出具体实例的描述给工厂工厂就会自动返回具体的实例对象。场景采用简单工厂模式设计一款运算器可以自由添加运算规则#includeiostream #includestring #includevector #includestack using namespace std; /** * 计算器运算抽象类 */ class Operation { private: double numberA;//操作数A double numberB;//操作数B public: /** * 抽象方法 * 获得操作结果 */ virtual double getResult() 0; /** * 获取 操作数A */ double getNumberA() { return this-numberA; } /** * 设置 操作数A */ void setNumberA(double numberA) { this-numberA numberA; } /** * 获取 操作数B */ double getNumberB() { return this-numberB; } /** * 设置 操作数B */ void setNumberB(double numberB) { this-numberB numberB; } }; /** * 加法运算类 */ class OperationAdd: public Operation { public: double getResult() { return getNumberA() getNumberB(); } }; /** * 减法运算类 */ class OperationSub: public Operation { double getResult() { return getNumberA() - getNumberB(); } }; /** * 乘法运算类 */ class OperationMul: public Operation { double getResult() { return getNumberA() * getNumberB(); } }; /** * 除法运算类 */ class OperationDiv: public Operation { double getResult() { double num getNumberB(); if(num 0) throw Division by zero condition!; return getNumberA() / getNumberB(); } }; /** * 运算静态工厂类 */ class OperationFactory { /** * 创建运算工厂 * param operate 操作符( - * /) * return 匹配运算类 */ public: Operation* createOperation(char c) { Operation *operation; switch (c) { case : operationnew OperationAdd();//创建加法运算类 break; case -: operationnew OperationSub();//创建减法运算类 break; case *: operationnew OperationMul();//创建乘法运算类 break; case /: operationnew OperationDiv();//创建除法运算类 break; } return operation; } }; /** * 大话设计模式C实现 * 第一章:简单工厂模式(静态工厂模式) */ int main() { Operation *operation; double result; operation OperationFactory().createOperation(); operation-setNumberA(1.1); operation-setNumberB(2.2); result operation-getResult(); cout加法结果resultendl; operation OperationFactory().createOperation(-); operation-setNumberA(3.3); operation-setNumberB(2.2); result operation-getResult(); cout减法结果resultendl; operation OperationFactory().createOperation(*); operation-setNumberA(3.3); operation-setNumberB(2.2); result operation-getResult(); cout乘法结果resultendl; operation OperationFactory().createOperation(/); operation-setNumberA(3.3); operation-setNumberB(2.2); result operation-getResult(); cout除法结果resultendl; return 0; }优点我们可以对创建的对象进行一些 “加工” 而且客户端并不知道因为工厂隐藏了这些细节。如果没有工厂的话那我们是不是就得自己在客户端上写这些代码这就好比本来可以在工厂里生产的东西拿来自己手工制作不仅麻烦以后还不好维护。缺点如果需要在方法里写很多与对象创建有关的业务代码而且需要的创建的对象还不少的话我们要在这个简单工厂类里编写很多个方法每个方法里都得写很多相应的业务代码而每次增加子类或者删除子类对象的创建都需要打开这简单工厂类来进行修改。这会导致这个简单工厂类很庞大臃肿、耦合性高而且增加、删除某个子类对象的创建都需要打开简单工厂类来进行修改代码也违反了开-闭原则。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询