简单工厂模式

先写一个简单的计算器类

#include<iostream>
using namespace std;
int yunsuan(int a, char ysf, int b)
{
	switch (ysf)
	{
	case '+':return a + b;break;
	case '-':return a - b;break;
	case '*':return a * b;break;
	case '%':
	{if (b == 0)throw 0;
	 return a/b; 
     break;
    }
	}
}
void main()
{
		cout << "num1: " << endl;
		int a;
		cin >> a;
		cout << "操作符: " << endl;
		char ysf;
		cin >> ysf;
		cout << "num2: " << endl;
		int b;
		cin >> b;
		try { cout << yunsuan(a, ysf, b); }
	catch (int a){cout << "除数不能为0" << endl;}
}

在这里插入图片描述

1.将业务逻辑(yunsuan)与界面逻辑分开(main)(另外建个文件更好些)
2.处理了除数为0的异常(if不行吗,try的作用补充下)
在这里插入图片描述
若需要加入一个平方根运算,则需要在yunsuan()中加一个case,其他的运算情况都需要加入编译,这个例子比较简单,若其他运算情况涉及到一些机密的算法,将其开放出去给程序员将不安全,因此应该把这些运算情况分离开来,修改其中一个不需要编译其他几个:
将这些运算情况中公有的部分提取出来做为基类,让每个运算情况继承这个基类:

class yunsuan
{
protected:
	double num1;
	double num2;
public:
	yunsuan(int value1, int value2)
	{
		num1 = value1;
		num2 = value2;
	}
	virtual int getresult()
	{
		int result = 0;
		return result;
	}
};
class add:public yunsuan
{
	int getresult()
	{
		int result =num1+num2;
		return result;
     }
};
class sub :public yunsuan
{
	int getresult()
	{
		int result = num1 - num2;
		return result;
	}
};
class mul :public yunsuan
{
	int getresult()
	{
		int result = num1 * num2;
		return result;
	}
};
class div :public yunsuan
{
	int getresult()
	{
		if (num2 == 0)throw 0; 
		int result = num1 / num2;
		return result;
	}
};

还需要用一个单独的类来做这个创造实例的过程,这个类就是工厂类:

class yunsuanfactory
{
public:
	static yunsuan* createyunsuan(char s1)
	{
		yunsuan* ys = nullptr;
		switch (s1)
		{
		case'+':ys = new addyunsuan();break;//父类指针可以指向子类
		case'-':ys = new subyunsuan();break;
		case'*':ys = new mulyunsuan();break;
		case'%':ys = new divyunsuan();break;
		}
		return ys;
	}
};

该工厂有一个负责生产的方法:createyunsuan,该方法接收一个字符型参数,根据该参数new一个派生类对象(±*%),然后用一个基类指针指向该对象,最后返回该对象。
由于在客户端使用时不用实例化工厂,通过类来调用即可,故这里将createyunsuan方法声明为static
客户端代码:

void main()
{
		cout << "num1: " << endl;
		int a;
		cin >> a;
		cout << "操作符: " << endl;
		char ysf;
		cin >> ysf;
		yunsuan* ys;
		ys = yunsuanfactory::createyunsuan(ysf);
		ys->num1 = a;
		cout << "num2: " << endl;
		int b;
		cin >> ys->num2;
		try { cout << ys->getresult(); }
	catch (int a){cout << "除数不能为0" << endl;}
}

看起来代码长了很多,但代码的维护性与安全性得到了提升,这对于大型项目来说至关重要
不管是windows程序,还是web程序等都可以使用该代码提供的接口,具有更高的移植性
若要增加各种复杂的运算,比如平方根,立方根等只要增加相应的运算子类即可,而不需要去重新编译不用变化的子类。然后在工厂类中的switch中增加分支即可使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python简单工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需直接暴露对象的创建逻辑。简单工厂模式通过一个工厂类来封装对象的创建过程,客户端只需要通过工厂类来获取所需的对象,而无需关心对象的具体创建细节。 在Python中,实现简单工厂模式通常包括以下几个步骤: 1. 定义一个抽象基类或接口,用于表示所要创建的对象的共同特征。 2. 创建具体的产品类,它们实现了抽象基类或接口,并提供了具体的功能实现。 3. 创建一个工厂类,该类包含一个静态方法或类方法,用于根据客户端的需求创建具体的产品对象。 4. 客户端通过调用工厂类的方法来获取所需的产品对象。 下面是一个简单的Python简单工厂模式的示例: ```python from abc import ABC, abstractmethod # 定义抽象基类 class Product(ABC): @abstractmethod def operation(self): pass # 具体产品类A class ConcreteProductA(Product): def operation(self): return "ConcreteProductA operation" # 具体产品类B class ConcreteProductB(Product): def operation(self): return "ConcreteProductB operation" # 工厂类 class SimpleFactory: @staticmethod def create_product(product_type): if product_type == "A": return ConcreteProductA() elif product_type == "B": return ConcreteProductB() else: raise ValueError("Invalid product type") # 客户端代码 product_a = SimpleFactory.create_product("A") print(product_a.operation()) # 输出:ConcreteProductA operation product_b = SimpleFactory.create_product("B") print(product_b.operation()) # 输出:ConcreteProductB operation ``` 在上述示例中,抽象基类`Product`定义了产品的共同特征,具体产品类`ConcreteProductA`和`ConcreteProductB`分别实现了抽象基类,并提供了具体的功能实现。工厂类`SimpleFactory`包含一个静态方法`create_product`,根据客户端传入的产品类型来创建具体的产品对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值