//5.工厂模式
//ver1
//回顾简单工厂模式
class OperationFactory
{
public:static Operation createOperation(char chOper){Operation * op = NULL;switch(chOper){case '+':op = new OperationAdd();break;case '-':op = new OperationSub();break;default:break;}return *op;}
};void main11()
{Operation oper;oper = OperationFactory::createOperation('+');oper.SetNumberA(1.1);oper.SetNumberB(2.2);double result = oper.GetResult();
}//工厂模式:
//工厂接口
class Operation
{
public:Operation(){}~Operation(){}
protected:double _NumberA;double _NumberB;
public:void SetNumberA(double A){_NumberA = A;}double GetNumberA(){return _NumberA;}void SetNumberB(double B){_NumberB = B;}double GetNumberB(){return _NumberB;}virtual double GetResult(){double result = 0;return result;}
};class OperationAdd : public Operation
{
public:virtual double GetResult(){double result = _NumberA + _NumberB;return result;}
};class OperationSub : public Operation
{
public:virtual double GetResult(){double result = _NumberA - _NumberB;return result;}
};class IFactory
{
public:virtual Operation CreateOperation(){Operation * po = NULL;return *po;}
};class AddFactory : public IFactory
{
public:virtual Operation CreateOperation(){Operation * po = new OperationAdd();return *po;}
};class SubFactory : public IFactory
{
public:virtual Operation CreateOperation(){Operation * po = new OperationSub();return *po;}
};void main1()
{IFactory * pif = new AddFactory();Operation po = pif->CreateOperation();po.SetNumberA(1.1);po.SetNumberB(2.2);double result = po.GetResult();
}

//简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,
//对于客户端来说,去除了与具体产品的依赖。

//工厂模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
//工厂模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,也就是说,工厂方式把
//简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类,现在是改客户端。

//5.工厂模式
//ver2
class LeiFeng
{
public:void Sweep(){//打扫}void Wash(){//洗衣}
};//学习雷锋大学生
class Undergraduate : public LeiFeng
{};//志愿者
class Volunteer : public LeiFeng
{};//简单雷锋工厂
class SimpleFactory
{
public:static LeiFeng CreateLeiFeng(char cType){LeiFeng * plf = NULL;switch (cType){case '1': //大学生plf = new Undergraduate();break;case '2': //志愿者plf = new Volunteer();break;default:break;}return *plf;}
};void main21()
{LeiFeng stuA = SimpleFactory::CreateLeiFeng('1');stuA.Sweep();LeiFeng volA = SimpleFactory::CreateLeiFeng('2');volA.Wash();
}//雷锋工厂
class IFactory
{
public://IFactory(){}LeiFeng CreateLeiFeng(){LeiFeng * plf = new LeiFeng();return *plf;}
};//大学生工厂
class UndergraduateFactory : public IFactory
{
public://UndergraduateFactory(){}LeiFeng CreateLeiFeng(){LeiFeng *plf = new Undergraduate();return *plf;}
};//志愿者工厂
class VolunteerFactory : public IFactory
{
public://VolunteerFactory(){}LeiFeng CreateLeiFeng(){LeiFeng * plf = new Volunteer();return *plf;}
};void main22()
{IFactory * pf = new UndergraduateFactory();LeiFeng stu = pf->CreateLeiFeng();stu.Sweep();stu.Wash();
}

//工厂模式客服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
//缺点:每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

 

转载于:https://www.cnblogs.com/sylar-liang/p/6025042.html

设计模式(5)--工厂模式相关推荐

  1. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  2. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  3. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  4. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  5. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  6. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  7. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  8. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  9. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

  10. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

最新文章

  1. 13 Java程序员面试宝典视频课程之容器
  2. 半木夏低风险交易记录二
  3. Service的生命周期
  4. Angular core.js executeTemplate
  5. 从手机App到网点交互请求的日志记录
  6. [转]在Windows 下使用OpenCL
  7. delphi 通过句柄获取exe文本框内容_实战经验:通过NotifyAddrChange侦测网络变化
  8. Cookie,Session解决用户的会话跟踪问题
  9. 查询与删除MSSQL中所有外键约束
  10. 【转】LPCTSTR,LPWSTR, PTSTR, LPTSTR区别
  11. sql取逗号隔开的值_想学好Excel函数?你得先搞懂函数公式中逗号和星号的区别...
  12. 计算机改桌面存储地址,c盘桌面路径改为d盘(怎样更改电脑桌面存储路径)
  13. python---面向对象1
  14. 企业邮箱注册—企业微信邮箱2.0时代正式来临!
  15. rips php,审计PHP工具篇之 RIPS
  16. 【同步与补偿】频率偏移
  17. matlab 提取极值,利用matlab 进行极值统计的一个例子——gev 方法.pdf
  18. 【多线程】多线程案例
  19. python爬取天猫_Python如何抓取天猫商品详细信息及交易记录
  20. java redis 过期_Redis中的键值过期操作

热门文章

  1. 汇编语言重写除零中断
  2. 【算法竞赛学习】金融风控之贷款违约预测-模型融合
  3. 结巴分词关键词相似度_gensim和jieba分词进行主题分析,文本相似度
  4. 任意进制转化 函数 模板(一)
  5. 数据结构-线性表之顺序表
  6. windows上运行MapReduce出错(Failed to set permissions of path)
  7. (3)stm32开发之串口的调试
  8. SUSE Linux 维护笔记一
  9. expecting statement错误的一种情况(phpstorm 8.0.2)
  10. 【图像分类】如何使用 mmclassification 训练自己的分类模型