设计模式(1)-使用简单工厂优化代码

首先看一段程序,目的是完成一个计算器的计算,

面向过程的写法

#include "stdafx.h"
#include <string>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
 int strNumA,strNumB;
 int strOperator;
 cout<<"请输入数字A:\n";
 cin>>strNumA;
 cout<<"请选择运算符号(1,+,2,-,3,*,4,/):\n";
 cin>>strOperator;
 cout<<"请输入数字B:\n";
 cin>>strNumB;

 int strResult;
 switch(strOperator)
 {
 case OPERATOR_ADD:
 strResult = strNumA + strNumB;
 break;
 case OPERATOR_MINUS:
 strResult = strNumA - strNumB;
 break;
 case OPERATOR_MUTHL:
 strResult = strNumA * strNumB;
 break;
 case OPERATOR_DIV:
 if(strNumB!=0)
 strResult = strNumA / strNumB;
 else
 cout<<"您输入的有误,除数不能为0!"<<endl;
 break;
 default:
 cout<<"输入有错误!"<<endl;
 break;
 }
 cout<<"得到的结果是:"<<strResult;
 return 0;
}

这样出来的程序每次都需要修改,比如我要添加一个取平方根的操作,需要修改程序,如果在增加,还是继续修改。

面向对象和面向过程的对比就不用多说了吧,借用书上的一句话

通过继承封装和多态把程序的耦合度降低,使用设计模式使程序更灵活更加容易复用。

第一步 剥离业务,现在程序都是混在一起的,将业务剥离出来

创建类Operaton

class Operaton
{
public:
 int getResult(int strNumA,int operFlag,int strNumB)
 {
 int result=0;
 switch(operFlag)
 {
 case OPERATOR_ADD:
 result = strNumA + strNumB;
 break;
 case OPERATOR_MINUS:
 result = strNumA - strNumB;
 break;
 case OPERATOR_MUTHL:
 result = strNumA * strNumB;
 break;
 case OPERATOR_DIV:
 if(strNumB!=0)
 result = strNumA / strNumB;
 else
 cout<<"您输入的有误,除数不能为0!"<<endl;
 break;
 default:
 cout<<"输入有错误!"<<endl;
 break;
 }
 return result;
 }
};

修改main函数

int main(int argc, char* argv[])
{
 int strNumA,strNumB;
 int strOperator;
 cout<<"请输入数字A:\n";
 cin>>strNumA;
 cout<<"请选择运算符号(1,+,2,-,3,*,4,/):\n";
 cin>>strOperator;
 cout<<"请输入数字B:\n";
 cin>>strNumB;

 int strResult = 0;
 Operaton *op = new Operaton;
 strResult = op->getResult(strNumA,strOperator,strNumB);
 cout<<"得到的结果是:"<<strResult;
 return 0;
}

这样实现了业务逻辑的分离,但是还是没解决刚才的问题,如果再添加操作或业务还需要再修改业务类文件。

第二步 使用简单工厂

工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。

看一下类图的描述


从而得到的几个文件Operaton.cpp,Operaton.h,OperatonAdd.cpp,OperatonAdd.h,OperatonSub.cpp,OperatonSub.h,OperatonMul.cpp,OperatonMul.h,OperatonDiv.cpp,OperatonDiv.h

Operaton.h

<p>class Operaton<br>{</p><p>public:<br> Operaton();<br> virtual ~Operaton();<br> int numA;<br> int numB;</p><p> virtual int getResult() = 0;</p><p>};</p>

Operaton.cpp

<p>#include "stdafx.h"<br>#include "Operaton.h"</p><p><br>Operaton::Operaton(){</p><p>}</p><p>Operaton::~Operaton(){</p><p>}</p>

OperatonAdd.h

#include "Operaton.h"

class OperatonAdd : public Operaton
{

public:
 OperatonAdd();
 virtual ~OperatonAdd();

 int getResult();

};

OperatonAdd.cpp

#include "stdafx.h"
#include "OperatonAdd.h"

OperatonAdd::OperatonAdd(){

}

OperatonAdd::~OperatonAdd(){

}

int OperatonAdd::getResult(){
 return numB + numA;
}

OperatonSub.h

#include "Operaton.h"

class OperatonSub : public Operaton
{

public:
 OperatonSub();
 virtual ~OperatonSub();

 virtual int getResult();

};

OperatonSub.cpp

#include "stdafx.h"
#include "OperatonSub.h"

OperatonSub::OperatonSub(){

}

OperatonSub::~OperatonSub(){

}

int OperatonSub::getResult(){
 return numA * numB;
}

OperatonMul.h

#include "Operaton.h"

class OperatonMul : public Operaton
{

public:
 OperatonMul();
 virtual ~OperatonMul();

 virtual int getResult();

};

OperatonMul.cpp

#include "stdafx.h"
#include "OperatonMul.h"

OperatonMul::OperatonMul(){

}

OperatonMul::~OperatonMul(){

}

int OperatonMul::getResult(){
 return numA - numB;
}

OperatonDiv.h

#include "Operaton.h"
#include <iostream>

using namespace std;

class OperatonDiv : public Operaton
{

public:
 OperatonDiv();
 virtual ~OperatonDiv();

 virtual int getResult();

};

OperatonDiv.cpp

#include "stdafx.h"
#include "OperatonDiv.h"

OperatonDiv::OperatonDiv(){

}

OperatonDiv::~OperatonDiv(){

}

int OperatonDiv::getResult(){
 int result;
 if(numB!=0)
 result = numA / numB;
 else
 cout<<"您输入的有误,除数不能为0!"<<endl;
 return result;
}

OperatonFactory.h

class OperatonFactory
{

public:
 OperatonFactory();
 virtual ~OperatonFactory();

 Operaton* create(int operFlag);

};

OperatonFactory.cpp

#include "stdafx.h"
#include "Operaton.h"
#include "OperatonAdd.h"
#include "OperatonDiv.h"
#include "OperatonMul.h"
#include "OperatonSub.h"
#include "OperatonFactory.h"

OperatonFactory::OperatonFactory(){

}

OperatonFactory::~OperatonFactory(){

}

Operaton* OperatonFactory::create(int operFlag){
 Operaton* operaton;
 switch(operFlag)
 {
 case OPERATOR_ADD:
 operaton = new OperatonAdd();
 break;
 case OPERATOR_MINUS:
 operaton = new OperatonSub();
 break;
 case OPERATOR_MUTHL:
 operaton = new OperatonMul();
 break;
 case OPERATOR_DIV:
 operaton = new OperatonDiv();
 break;
 default:
 cout<<"输入有错误!"<<endl;
 break;
 }
 return operaton;
}

在这里操作返回的对象,将业务分的更细致,main的代码可改为

#include "stdafx.h"
#include <string>
#include <iostream>
#include "Operaton.h"
#include "OperatonFactory.h"

using namespace std;

int main(int argc, char* argv[])
{
 int strNumA,strNumB;
 int strOperator;
 cout<<"请输入数字A:\n";
 cin>>strNumA;
 cout<<"请选择运算符号(1,+,2,-,3,*,4,/):\n";
 cin>>strOperator;
 cout<<"请输入数字B:\n";
 cin>>strNumB;

 int strResult = 0;
 Operaton *op;
 OperatonFactory* opFactory = new OperatonFactory();
 op = opFactory->create(strOperator);
 op->numA = strNumA;
 op->numB = strNumB;
 strResult = op->getResult();
 cout<<"得到的结果是:"<<strResult;
 return 0;
}

这样,如果继续增加比如求平方,取余就可以不修改main中的内容了。当然现在还没有完全移除if和switch,在下面的历程中会逐一讲到。

时间: 2024-10-07 22:00:49

设计模式(1)-使用简单工厂优化代码的相关文章

以Java代码为例讲解设计模式中的简单工厂模式_java

1. 简单工厂模式简介简单工厂模式(Simple Factory),又被称为"静态工厂方法模式".它属于"创建模式"(创建对象的模式),并且是"工厂方法"模式的一种特殊实现. 通常,我们利用简单工厂模式来进行类的创建.例如,获取线程池对象,就是通过简单工厂模式来实现的.它的结构图如下所示: 工厂:工厂是简单工厂模式的核心,提供了对外接口.客户端或其它程序要获取Product对象,都是通过Factory的接口来获取的. 抽象产品:抽象产品是(许多)

【设计模式系列】--简单工厂模式

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现.简单来说,通过专门定义一个类来辅助创建其他类的实例,被创建的实例通常都具有共同的父类,今天这篇博文,小编主要简单的介绍一下简单工程模式,通过简单的demo一步一步进行讲解,希望对有需要的小伙伴有帮助,还请小伙伴们多多指教.

设计模式学习:简单工厂

简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦,ne

设计模式之二(简单工厂模式)

原文:设计模式之二(简单工厂模式) 前言 简单工厂模式根据提供的数据或者参数返回几个可能的类中的一个实例,说通俗点有点像面向对象编程中的多态性,一个基类,有多个派生类,在另外的调用程序中,根据参数来决定返回这个基类的哪个具体的派生类,返回值为基类类型,因为基类的引用可以指向派生类对象,而且这些所有的派生类都包含有基类的函数,也就是说派生类中有相同的函数,但是函数的实现可能不同. 下面我只是来演示一下简单工厂模式,代码不会太复杂.所以大家可以使用Submile Text工具. 使用方法博客文章链接

C# 设计模式系列教程-简单工厂模式_C#教程

1. 概述: 将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计模式,但现实中却经常会用到 2. 模式中的角色 2.1 工厂类(Simple Factory): 只包含了创建具体类的静态方法. 2.2 抽象产品(Product):定义简单工厂中要返回的产品. 2.3 具体产品(ConcreteProduct):具体产品. 3. 模式解读 3.1 简单工厂模式的一般化类图 3.2 简单工厂模式的代码实现 /// <summary> /// 简单工厂类,用sealed修饰,

C++设计模式编程中简单工厂与工厂方法模式的实例对比_C 语言

简单工厂模式实例题目:实现计算器的输入2个数和运算符,得到结果 工程结构: (1)头文件 COperationFactory.h(运算符工厂类) (2)源文件 SimpleFactory.cpp(客户端应用类,主函数所在) (3)运算类 COperation.cpp(运算符基类) COperation.h COperationAdd.h(加法运算符子类,继承于COperation) COperationDiv.h (除法运算符子类,继承于COperation) COperationMul.h (

实例解析C++设计模式编程中简单工厂模式的采用_C 语言

简单工厂模式中专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式. 简单工厂模式的UML类图 简单工厂模式的程序通过封装继承来降低程序的耦合度,设计模式使得程序更加的灵活,易修该,易于复用. 简单工厂是在工厂类中做判断,从而创造相应的产品. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例.   该模式中包含的角色及其职责   1.工厂(Creator)角色  

Ruby中使用设计模式中的简单工厂模式和工厂方法模式_ruby专题

之前有看过<ruby设计模式>,不过渐渐的都忘记了.现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下. 简单工厂模式: # -*- encoding: utf-8 -*- #运算类 class Operation attr_accessor :number_a,:number_b def initialize(number_a = nil, number_b = nil) @number_a = number_a @number_b = number_b end d

Java设计模式编程中简单工厂与抽象工厂模式的使用实例_java

简单工厂模式类图 通过一个工厂类,以一个条件来创建对应的对象 //业务功能 public interface ICalculation { double getResult(double numA, double numB); } public class CalcAdd implements ICalculation { @Override public double getResult(double numA, double numB) { System.out.println("加法&qu