简单工厂模式及其应用案例

前言

工厂模式(Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

介绍

  • 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
  • 主要解决:主要解决接口选择的问题
  • 何时使用:我们明确地计划不同条件下创建不同实例时
  • 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品
  • 关键代码:创建过程在其子类执行

案例

简单的计算器程序,由用户输入操作符来实例化运算符对象。并引入异常处理机制。

  • Operation.h
#pragma once
#include <iostream>
#include <string>
#include <exception>
class Operation {
private:
	double numberA{0}, numberB{0};
public:
	void setNumberA(double numA_);
	void setNumberB(double numB_);
	double getNumberA();
	double getNumberB();
	virtual double getResult();
	class OperationException: public std::exception {
	public:
		const char* what() const throw();
	};
	class BadOperationException: public Operation::OperationException {
	public:
		const char* what() const throw();
	};
	class DivZeroException: public Operation::OperationException {
	public:
		const char* what() const throw();
	};
};

class AddOperation: public Operation {
public:
	double getResult();
};

class SubOperation: public Operation {
public:
	double getResult();
};

class MulOperation: public Operation {
public:
	double getResult();
};

class DivOperation: public Operation {
public:
	double getResult();
};

class OperationFactory {
public:
	static Operation* createOperation(char operate_);
};
  • Operation.cpp
#include "Operation.h"

void Operation::setNumberA(double numA_) {
	numberA = numA_;
}

void Operation::setNumberB(double numB_) {
	numberB = numB_;
}

double Operation::getNumberA() {
	return numberA;
}

double Operation::getNumberB() {
	return numberB;
}

double Operation::getResult() {
	return 0.0;
}

double AddOperation::getResult() {
	double result{0};
	result = getNumberA() + getNumberB();
	return result;
}

double SubOperation::getResult() {
	double result{0};
	result = getNumberA() - getNumberB();
	return result;
}

double MulOperation::getResult() {
	double result{0};
	result = getNumberA() * getNumberB();
	return result;
}

double DivOperation::getResult() {
	double result{0};
	try {
		if (getNumberB() == 0)
			throw Operation::DivZeroException();
	}
	catch (Operation::DivZeroException& exce_) {
		std::cout << exce_.what() << std::endl;
		exit(0);
	}
	result = getNumberA() / getNumberB();
	return result;
}

Operation* OperationFactory::createOperation(char operate_) {
	try {
		Operation* operation = nullptr;
		switch (operate_) {
			case '+':
				operation = new AddOperation;
				break;
			case '-':
				operation = new SubOperation;
				break;
			case '*':
				operation = new MulOperation;
				break;
			case '/':
				operation = new DivOperation;
			default:
				break;
		}

		if (operation != nullptr)
			return operation;
		throw Operation::BadOperationException();
	}
	catch (Operation::BadOperationException& exce_) {
		std::cout << exce_.what() << std::endl;
		exit(0);
	}
}

const char* Operation::OperationException::what() const throw() {
	return "Exception.";
}

const char* Operation::BadOperationException::what() const throw() {
	return "Exception: Bad operation.";
}

const char* Operation::DivZeroException::what() const throw() {
	return "Exception: Divide 0.";
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计模式是一些被广泛接受并经过验证的解决方案,用于解决软件设计常见的问题。下面我会详细介绍几种常见的设计模式及其应用案例: 1. 单例模式 (Singleton Pattern): 单例模式用于确保一个类只有一个实例,并提供全局访问点。例如,数据库连接池就可以使用单例模式实现,确保整个应用程序只有一个数据库连接池实例。 2. 工厂模式 (Factory Pattern): 工厂模式用于创建对象,而不需要暴露对象的创建逻辑。例如,一个汽车制造工厂可以根据客户需求生产不同类型的汽车。 3. 观察者模式 (Observer Pattern): 观察者模式用于在对象之间建立一对多的依赖关系,当一个对象状态发生改变时,其依赖的对象会自动收到通知并更新。例如,一个新闻发布系统,订阅者可以接收到新闻发布者发布的新闻通知。 4. 策略模式 (Strategy Pattern): 策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。这样可以使算法独立于使用它的客户端而变化。例如,一个电商网站可以根据用户的购买历史和偏好,采用不同的促销策略来推送优惠活动。 5. 装饰器模式 (Decorator Pattern): 装饰器模式允许你通过将对象包装在装饰器类来动态地添加新的行为。例如,一个咖啡店可以使用装饰器模式来添加额外的配料(如牛奶、糖等)到咖啡。 6. 适配器模式 (Adapter Pattern): 适配器模式用于将一个类的接口转换成客户端所期望的另一个接口。例如,一个音频播放器可以使用适配器模式来兼容不同类型的音频格式。 以上只是几种常见的设计模式,每种设计模式都有其特定的应用场景和优势。在实际开发,根据具体需求选择合适的设计模式可以提高代码的可维护性、可扩展性和重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值