zoukankan      html  css  js  c++  java
  • 设计模式1-简单工厂模式

    一、简单描述

      工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合

    二、类图

      

    二、适用场景

    1. 在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用简单工厂模式;
    2. 由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护。

    三、代码

     1 #include <iostream>
     2 class Calculator {
     3 public:
     4     Calculator() : number1(0), number2(0) {}
     5     Calculator(int n1, int n2) : number1(n1), number2(n2) {}
     6     virtual ~Calculator() {}
     7     virtual int GetResult() { return 0; }
     8     virtual void SetNumber1(int n) { number1 = n; }
     9     virtual void SetNumber2(int n) { number2 = n; }
    10 protected:
    11     int number1;
    12     int number2;
    13 };
    14 
    15 
    16 class Add : public Calculator {
    17 public:
    18     virtual int GetResult() {
    19         return number1 + number2;
    20     }
    21 };
    22 
    23 class Plus : public Calculator {
    24 public:
    25     //这里为了程序简单,就不再判断是否number1>number2,默认number1 > number2
    26     virtual int GetResult() {
    27         return number1 - number2;
    28     }
    29 };
    30 
    31 enum SIGNAL {
    32     _add,
    33     _plus
    34 };
    35 
    36 class CalculatorFactory {
    37 public:
    38     Calculator *GetOperator(SIGNAL s) {
    39         switch(s) {
    40             case _add:
    41                 calculator = new Add(); //记得要释放指针
    42                 break;
    43             case _plus:
    44                 calculator = new Plus();
    45                 break;
    46         }
    47         return calculator;
    48     }
    49 private:
    50     Calculator *calculator; //这里必须是指针或者引用,不然无法实现多态
    51 };
    52 
    53 int main()
    54 {
    55     Calculator *cal = CalculatorFactory().GetOperator(_add);
    56     cal->SetNumber1(10);
    57     cal->SetNumber2(5);
    58     std::cout << "calculator: " << cal->GetResult() << std::endl;
    59     delete cal;
    60     return 0;
    61 }
  • 相关阅读:
    Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)
    rocketmq发送消息的三种方式
    windows下RocketMQ安装部署
    idea多设备自动同步配置
    idea复制springboot的maven项目后,修改了maven名称,但maven工具里的maven名称没改变,不生效
    SpringBoot图文教程16—SpringBoot 多模块开发「web」「打包」
    spring-boot-starter-parent的作用
    JDK8 从永久代到元空间
    Spring 生命周期
    mesos Failed to connect to
  • 原文地址:https://www.cnblogs.com/457220157-FTD/p/3993484.html
Copyright © 2011-2022 走看看