简单工厂模式(大话设计模式)C/C++版本

简单工厂模式

C++版本

参考:https://www.cnblogs.com/Galesaur-wcy/p/15926669.html

#include <iostream>
using namespace std;
// 运算类
class Operation
{
private:
	double _NumA;
	double _NumB;

public:
	void SetNumA()
	{
		cout << "Enter a double number: ";
		if (!(cin >> _NumA))
			throw "It must be a number";
	}

	double GetNumA()
	{
		return _NumA;
	}

	void SetNumB()
	{
		cout << "Enter a double number: ";
		if (!(cin >> _NumB))
			throw "It must be a number";
	}

	double GetNumB()
	{
		return _NumB;
	}

	virtual double GetResult()
	{
		int result = 0;
		return result;
	}
};

class OperationAdd : public Operation
{
public:
	double GetResult()
	{
		double result = GetNumA() + GetNumB();
		return result;
	}
};

class OperationSub : public Operation
{
public:
	double GetResult()
	{
		double result = GetNumA() - GetNumB();
		return result;
	}
};

class OperationMul : public Operation
{
public:
	double GetResult()
	{
		double result = GetNumA() * GetNumB();
		return result;
	}
};

class OperationDiv : public Operation
{
public:
	double GetResult()
	{
		if (GetNumB() == 0)
		{
			throw "The divisor cannot be 0";
		}
		double result = GetNumA() / GetNumB();
		return result;
	}
};

class OperatorFactory
{
public:
	Operation *CreatOperation(char s)
	{
		Operation *ope = nullptr;
		switch (s)
		{
		case '+':
			ope = new OperationAdd;
			break;
		case '-':
			ope = new OperationSub;
			break;
		case '*':
			ope = new OperationMul;
			break;
		case '/':
			ope = new OperationDiv;
			break;
		default:
			throw "Error input operator!";
			break;
		}
		return ope;
	}
};

int main()
{
	OperatorFactory fac;
	cout << "Choose an operation:";
	char operator_char;
	cin >> operator_char;
	try
	{
		Operation *oper = fac.CreatOperation(operator_char);
		oper->SetNumA();
		oper->SetNumB();
		cout << "result is: " << oper->GetResult() << endl;
	}
	catch (const char *err)
	{
		cerr << err << endl;
		return -1;
	}

	return 0;
}

C版本

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

typedef struct Operation
{
    double NumA;
    double NumB;
    double (*GetResult)(struct Operation *);
} Operation;

typedef struct OperationAdd
{
    Operation base; // 设置为第一个成员属性,模拟继承
} OperationAdd;

typedef struct OperationSub
{
    Operation base;
} OperationSub;

typedef struct OperationMul
{
    Operation base;
} OperationMul;

typedef struct OperationDiv
{
    Operation base;
} OperationDiv;

double OperationAddGetResult(struct Operation *op)
{
    OperationAdd *add = (OperationAdd *)op;
    return add->base.NumA + add->base.NumB;
}

double OperationSubGetResult(struct Operation *op)
{
    OperationSub *sub = (OperationSub *)op;
    return sub->base.NumA - sub->base.NumB;
}

double OperationMulGetResult(struct Operation *op)
{
    OperationMul *mul = (OperationMul *)op;
    return mul->base.NumA * mul->base.NumB;
}

double OperationDivGetResult(struct Operation *op)
{
    OperationDiv *div = (OperationDiv *)op;
    if (div->base.NumB == 0)
    {
        fputs("The divisor cannot be 0\n", stderr);
        exit(EXIT_FAILURE);
    }
    return div->base.NumA / div->base.NumB;
}

Operation *CreateOperation(char op)
{
    Operation *ope = NULL;
    switch (op)
    {
    case '+':
        ope = malloc(sizeof(OperationAdd));
        ope->GetResult = OperationAddGetResult;
        break;
    case '-':
        ope = malloc(sizeof(OperationSub));
        ope->GetResult = OperationSubGetResult;
        break;
    case '*':
        ope = malloc(sizeof(OperationMul));
        ope->GetResult = OperationMulGetResult;
        break;
    case '/':
        ope = malloc(sizeof(OperationDiv));
        ope->GetResult = OperationDivGetResult;
        break;
    default:
        fputs("Error input operator!\n", stderr);
        return NULL;
    }
    return ope;
}

void SetNumA(Operation *ope)
{
    printf("Enter a double number: ");
    if (scanf("%lf", &ope->NumA) != 1)
    {
        fputs("It must be a number\n", stderr);
        exit(EXIT_FAILURE);
    }
}

void SetNumB(Operation *ope)
{
    printf("Enter a double number: ");
    if (scanf("%lf", &ope->NumB) != 1)
    {
        fputs("It must be a number\n", stderr);
        exit(EXIT_FAILURE);
    }
}

int main()
{
    printf("Choose an operation: ");
    char operator_char = getchar();

    Operation *oper = CreateOperation(operator_char);
    if (!oper)
        return EXIT_FAILURE;

    SetNumA(oper);
    SetNumB(oper);
    printf("Result is: %f\n", oper->GetResult(oper));

    free(oper);
    return 0;
}

在前一版的基础上,将SetNumA和SetNumB设置为Operation类(结构体)的行为,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

typedef struct Operation
{
    double NumA;
    double NumB;
    double (*GetResult)(struct Operation *);
    void (*SetNumA)(struct Operation *);
    void (*SetNumB)(struct Operation *);
} Operation;

typedef struct OperationAdd
{
    Operation base; // 设置为第一个成员属性,模拟继承
} OperationAdd;

typedef struct OperationSub
{
    Operation base;
} OperationSub;

typedef struct OperationMul
{
    Operation base;
} OperationMul;

typedef struct OperationDiv
{
    Operation base;
} OperationDiv;

double OperationAddGetResult(struct Operation *op)
{
    OperationAdd *add = (OperationAdd *)op;
    return add->base.NumA + add->base.NumB;
}

double OperationSubGetResult(struct Operation *op)
{
    OperationSub *sub = (OperationSub *)op;
    return sub->base.NumA - sub->base.NumB;
}

double OperationMulGetResult(struct Operation *op)
{
    OperationMul *mul = (OperationMul *)op;
    return mul->base.NumA * mul->base.NumB;
}

double OperationDivGetResult(struct Operation *op)
{
    OperationDiv *div = (OperationDiv *)op;
    if (div->base.NumB == 0)
    {
        fputs("The divisor cannot be 0\n", stderr);
        exit(EXIT_FAILURE);
    }
    return div->base.NumA / div->base.NumB;
}

void SetNumA(Operation *ope)
{
    printf("Enter a double number: ");
    if (scanf("%lf", &ope->NumA) != 1)
    {
        fputs("It must be a number\n", stderr);
        exit(EXIT_FAILURE);
    }
}

void SetNumB(Operation *ope)
{
    printf("Enter a double number: ");
    if (scanf("%lf", &ope->NumB) != 1)
    {
        fputs("It must be a number\n", stderr);
        exit(EXIT_FAILURE);
    }
}

Operation *CreateOperation(char op)
{
    Operation *ope = NULL;
    switch (op)
    {
    case '+':
        ope = malloc(sizeof(OperationAdd));
        ope->GetResult = OperationAddGetResult;
        break;
    case '-':
        ope = malloc(sizeof(OperationSub));
        ope->GetResult = OperationSubGetResult;
        break;
    case '*':
        ope = malloc(sizeof(OperationMul));
        ope->GetResult = OperationMulGetResult;
        break;
    case '/':
        ope = malloc(sizeof(OperationDiv));
        ope->GetResult = OperationDivGetResult;
        break;
    default:
        fputs("Error input operator!\n", stderr);
        return NULL;
    }
    ope->SetNumA = SetNumA;
    ope->SetNumB = SetNumB;
    return ope;
}

int main()
{
    printf("Choose an operation: ");
    char operator_char = getchar();

    Operation *oper = CreateOperation(operator_char);
    if (!oper)
        return EXIT_FAILURE;

    oper->SetNumA(oper);
    oper->SetNumB(oper);
    printf("Result is: %f\n", oper->GetResult(oper));

    free(oper);
    return 0;
}


相关推荐

  1. 简单工厂模式(大话设计模式)C/C++版本

    2024-06-14 07:00:06       23 阅读
  2. 大话设计模式简单工厂模式

    2024-06-14 07:00:06       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 07:00:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 07:00:06       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 07:00:06       82 阅读
  4. Python语言-面向对象

    2024-06-14 07:00:06       91 阅读

热门阅读

  1. STL - 常用算法

    2024-06-14 07:00:06       21 阅读
  2. 000003 - Hadoop集群配置

    2024-06-14 07:00:06       26 阅读
  3. 数据仓库学习之hbase-2.2.7分布式搭建

    2024-06-14 07:00:06       33 阅读
  4. mysql统计连续出现的数字

    2024-06-14 07:00:06       32 阅读
  5. Docker 部署 RocketMQ

    2024-06-14 07:00:06       33 阅读
  6. 算法题day43(补5.29日卡:动态规划03)

    2024-06-14 07:00:06       31 阅读
  7. XSLT <for-each> 元素深入解析

    2024-06-14 07:00:06       29 阅读
  8. 前端场景题:实现监控请求时常

    2024-06-14 07:00:06       24 阅读
  9. 在Elasticsearch中-SpaceJam一个全文搜索的实例

    2024-06-14 07:00:06       29 阅读