[设计模式学习]设计模式学习之简单工厂模式

设计模式学习-简单工厂模式 学习文章 C++设计模式-简单工厂模式 原理 工厂类提供一个创建产品类对象的接口,输入产品ID,输出产品基类指针。 示例代码 // 定义产品的ID typedef enum _Product_ID_{ E_PRODUCT_A, E_PRODUCT_B }Product_ID; // 产品基类,必须包含虚函数,作为公共接口。 class Product{ public: virtual void Show() = 0; }; // 产品类 class ProductA: public Product 阅读详情

最近在看《大话设计模式》,就做了一些学习笔记。
当然语言不是问题,本文采用C#语言。
面试单位要求用任意一种面向对象语言的面向对象思想实现一个计算机控制台程序,要求输入两个数和运算符号,得到结果。
第一次写的代码如下:

class Program
{
    static void Main(String[] args)
    {
        Console.WriteLine("请输入数字A:");
        string A = Console.ReadLine();
        Console.WriteLine("请选择运算符号(+,-,*,/):");
        string B = Console.ReadLine();
        Console.Write("请输入数字B:");
        string C = Console.ReadLine();
        string D = "";
        if(B == "+")
        {
            D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C));
        }
        if(B == "-")
        {
            D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C));
        }
    if(B == "*")
        {
            D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C));
        }
    if(B == "/")
        {
            D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C));
        }
        Console.WriteLine("结果是:" + D);
    }
}

乍一看,功能实现了,其实有很多不足之处。
1、A,B,C,D这样的命名极不规范。
2、if的判断分支,意味着每个条件都要做判断,等于计算机做了三次无用功。
3、如果除数时,用户输出了0怎么办?如果用户输入的是字符符号而不是数字怎么办?

马上改,第二次修改代码如下:

class Program
{
    static void Main(String[] args)
    {
    try
    {
        Console.WriteLine("请输入数字A:");
        string strNumberA = Console.ReadLine();
        Console.WriteLine("请选择运算符号(+,-,*,/):");
        string strOperate = Console.ReadLine();
        Console.Write("请输入数字B:");
        string strNumberB = Console.ReadLine();
        string strResult = "";
        switch(strOperate)
        {
            case "+":
            strResult = Convert.ToString(Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB));
            break;
            case "-":
            strResult = Convert.ToString(Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB));
            break;
            case "*":
            strResult = Convert.ToString(Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB));
            break;
            case "/":
            if(strNumberB != "0")
            strResult = Convert.ToString(Convert.ToDouble(strNumberA) / Convert.ToDouble(strNumberB));
            else
            strResult = "除数不能为0";
            break;
        }
        Console.WriteLine("结果是:" + strResult);
        Console.ReadLine();
    }
    catch(Exception ex)
    {
        Console.WriteLine("您的输入有错:" + ex.Message);
    }   
  }
}

大功告成了?别忘了出题人说的是面向对象,这里没有面向对象的思想。我们碰到问题总是直觉的用计算机能够理解的逻辑思维来描述和表达解决的问题及具体的求解过程。这样的思维使得我们的程序使得我们的程序只为满足实现当前的需求,程序不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。

我们可以考虑通过封装,继承,多态把程序的耦合度降低。如果公司要求你再写一个Windows的计算器,如何复用代码呢?最好是让业务逻辑和界面逻辑分开,让他们之间的耦合度降低。
Operator运算类

public class Operation
{
    public static double GetResult(double numberA, double numberB, string operator)
    {
        double result = 0d;
        switch(operator)
        {
            case "+":
                result = numberA + numberB;
            break;
            case "-":
                result = numberA - numberB;
            break;
            case "*":
                result = numberA * numberB;
            break;      
            case "/":
                result = numberA / numberB;
            break;
        }
        return result;
    }
}

客户端代码:

static void Main(string[] args)
{
    try
    {
        Console.WriteLine("请输入数字A:");
        string strNumberA = Console.ReadLine();
        Console.WriteLine("请选择运算符号(+,-,*,/):");
        string strOperate = Console.ReadLine();
        Console.Write("请输入数字B:");
        string strNumberB = Console.ReadLine();
        string strResult = "";
        strResult = Convert.ToString(Operation.GetResult(ConvertToDouble(strNumberA), ConvertToDouble(strNumberB), strOperate));
        Console.WriteLine("结果是:" + strResult);
        Console.ReadLine();
    }
    catch(Exception ex)
    {
        Console.WriteLine("您的输入有错:" + ex.Message);
    }   
}

有了面向对象的思想了吗?面向对象有三大特性:封装,继承,多态,这里只用到了封装,继续改。

Operation运算类:

public class Operation
{
    private double _numberA = 0;
    private double _numberB = 0;

    public double NumberA
    {
        get { return _numberA; }
        set { _numberA = value; }
    }
    public double NumberB
    {
        get { return _numberB; }
        set { _numberB = value; }
    }
    public virtual double GetResult()
    {
        double result = 0;
        return result;
    }
}

加减乘除类:

class OperationAdd : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA + NumberB;
        return result;
    }
}
class OperationSub : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA - NumberB;
        return result;
    }
}
class OperationMul : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA * NumberB;
        return result;
    }
}
class OperationDiv : Operation
{
    public override double GetResult()
    {
        double result = 0;
        if(NumberB == 0)
        {
            throw new Exception("除数不能为0");
        }
        result = NumberA / NumberB;
        return result;
    }
}

现在的问题是如何去实例化对象。好了,重点来了。”简单工厂模式”告诉你到底要实例化谁,将来会不会增加实例化的对象,我们应该考虑用单独的一个类来做这个创造实例的过程,这就是工厂。
简单运算工厂类:

public class OperationFactory
{
    public static Operation createOperate(String operate)
    {
        Operation oper = null;
        switch(operate)
        {
            case "+":
                oper = new OperationAdd();
            break;
            case "-":
                oper = new OperationSub();
            break;
            case "*":
                oper = new OperationMul();
            break;  
            case "/":
                oper = new OperationDiv();
            break;
        }
        return oper;
    }
}

客户端代码:

Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();

现在不关你是控制台程序,Windows程序,Web程序,PDA或手机程序,都可以采用这段代码来实现计算机的功能,如果有一天我们需要更改加法运算,只需要更改OperationAdd。如果需要增加各种复杂运算,只要增加相应的运算子类然后修改运算类工厂,在switch中添加分支就可以了,如果需要修改界面,直接修改就可以不需要修改运算。

心得:编程是一门技术,更是一项艺术。我们不能只满足于运行结果正确。时常考虑让代码更加简练,更加容易维护,容易扩展和复用,这样才不叫“搬砖”,才能得到真正提高。

CATIA二次开发CAA:(一)开发环境搭建 CATIA+CAA+RADE+VS2012 阅读详情

相关推荐

Frida实战:如何逆向分析某电商App的doCommandNative函数(附完整Hook脚本)

本文详细介绍了如何使用Frida逆向分析电商App中的doCommandNative函数,涵盖动态注册识别、SO加固对抗及高级Hook脚本编写等实战技巧。通过完整Hook脚本示例,帮助安全研究人员深入理解JNICLibrary的关键函数逆向分析方法,提升移动应用安全研究能力。

weixin_29327977的博客 615

【设计模式学习】01设计模式简介+初体验:简单工厂模式(静态工厂方法)

  写在前面的话:最近维护自己的代码的时候经常觉得无从下手,归根到底还是因为写的乱七八糟的,正好给了之前想学但又懒得开始学设计模式的我一个动力。   本次设计模式的全部学习内容均来自于《大话设计模式》这本书(程杰著),这本书用更加通俗易懂的方式介绍了GoF《设计模式》中的23种设计模式,个人觉得还是蛮有意思的~   值得一提的是这本书中的实例均使用C#作为编程语言,但设计模式主要是学思想嘛,所以...

南衣的博客 180

PLc S7-200 smart如何使用Modbus 485通讯传输接收数据

西门子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站协议库(西门子标准库指令)。使用 Modbus RTU 主站指令库,可以读写 Modbus RTU 从站的数字量、模拟量 I/O 以及保持寄存器,从而实现PLC通过modbus方式控制其他器件。提示:以下是本篇文章正文内容,下面案例可供参考。

xjbsw0的博客 6万+

设计模式1:简单工厂模式学习

算起来,俺从开始学c++到现在,也有大概7年了,即从大一就开始学习c++语言程序设计了。虽然对编程很感兴趣,但由于不是科班(生物医学工程专业),所以锻炼的机会自然较少一些。这期间,零零散散做过一些课程设计:图形图像处理的等等都用到了c++语言,但大多还是依葫芦画瓢,现在回想起来,那时写的code真是惨不忍睹啊。后来读研期间,跟随导师做了两年项目,算是感觉有些入门了。但是现在回想起来,以前项目中所写...

weixin_30747253的博客 134

PicoRV32 笔记 05

PicoRV32 本地总线接口

jjinl的专栏 1573

界面上下固定_基于ANSYS的胶粘结构界面开裂有限元计算

引言:目前工程上主要有螺栓,过盈,焊接和胶粘四种常用的连接方式,本文基于ANSYS Workbench环境,引入内聚力模型来实现对胶粘结构界面开裂失效的计算,文中的界面失效参数为随意给定,不是工程实际测试数据,仅起到演示作用!1.问题的描述如图所示给出了胶粘结构的三维模型,该胶粘结构由上下钢板组成,中间通过胶粘接到一起。(胶不需要建模,其影响主要通过内聚力模型实现)上下板的材料为结构钢,...

weixin_29473667的博客 1万+

java设计模式学习笔记之计算器中的简单工厂模式

java设计模式学习笔记之计算器中的简单工厂模式 最近在重温设计模式,偶然看到程杰的《大话设计模式》写的非常不错、通俗易懂,之后的一系列都是学习的笔记,仅此记录。 一、情景回放:某校大二软件工程专业班的《Java程序设计》课上,老师给大伙出了一个题目:用java实现一个简单的计算器功能(用

大力哥的博客 4795

机器学习【学校智慧食堂及其应用】

本文主要介绍机器学习【智慧食堂及其应用】

qq_201729558 2570

【设计模式学习】简单工厂模式

C++学习简单工厂模式首先,明确一点,简单工厂模式属于创建型模式,但不属于GoF的23种模式;简单工厂模式的定义: 根据传入的参数即可返回需要的对象,而不需要知道具体的类名;简单说明:就是根据传入的参数返回可能的类的具体实例,通常工厂返回的类都具有一个公共的方法和父类;而工厂是什么?就是产生实例类的工厂类,将对象的创建和使用分离开来;简单举例:如果你想吃水果,比如香蕉,现在有两种获取的方法,一种是自

John的博客 1320

上位机图像处理和嵌入式模块部署(qmacvisual获取边界点)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在图像处理中,解决了分割的问题之后,下面就是属性信息的提取。在这其中,有一种属性是非常重要的 ,那就是外界轮廓的边界点获取。这个边界点,可以用来计算长度,也可以用来进行直线、圆的拟合,具体的用途取决于现场的实际使用场景。目前qmacvisual支持对边界点的提取,相关控件可以直接用来提取边界点。

嵌入式-老费,一个分享专业嵌入式知识的blog 879

deepstream车道线检测自定义插件化,其中要注意pipeline的配置,如果插件位置配置不对,会报input format should be RGBA when using blur-obje

以上代码中,我们先从对象池中获取一个 DsUserMeta 对象,然后使用 get_lane_line_from_frame 函数获取车道线检测结果,并使用 add_lane_line_meta 函数将其添加到 DsUserMeta 对象中。注意,上述代码中的 get_lane_line_from_frame 函数和 add_lane_line_meta 函数需要你自己实现,用于从视频帧中提取车道线检测结果,并将其添加到 DsUserMeta 中。

pvmsmfchcs的博客 690

设计模式之简单工厂模式学习

学习C++有一两年了,面向对象思想也有所接触。使用过MFC以及OSG类库进行过开发,无非就是调用别人设计好的类库,要说自己使用面向对象的思想去开发程序,这个还真没有。 意识到自己在这方面的匮乏,开始学习设计模式。教材选用《大话设计模式》,每个章节的学习过程分为三部分:第一部分,阅读课本,第二部分:按照书上例子写出C++代码的对应版本。第三部分:博客上的学习笔记。 编程是一门技术,更是...

系统运维 136

MOSFET关断尖峰电压的机理与抑制

MOSFET在电力电子系统中存在开关尖峰电压/电流问题,主要源于寄生电感、密勒电容及开关瞬态特性。尖峰会引发过压击穿、功率损耗和EMI干扰。抑制措施包括优化驱动电路、添加缓冲网络(RC/RCD)、降低寄生电感(改进PCB布线/封装)、使用快速二极管及远端负载特殊处理(电抗器/滤波器)。系统性的器件选型与电路设计是确保功率电子稳定运行的关键。

硬核科技 1824

设计模式学习笔记—简单工厂模式

1.简单工厂模式 1.1 介绍 简单工厂模式属于创建型设计模式,由一个工厂对象的静态方法决定创建出哪一个具体实例。 1.2 优缺点 1.2.1 优点 工厂类负责处理根据不同条件创建具体实例,实例消费类不再需要通过复杂的逻辑创建实例,只需要给工厂类必要的判断条件。明确了各个类的职责,将实例和实例消费类完全解耦。 1.2.2 缺点 所有实例的创建逻辑全部集中在工厂类中,违反了高内聚责任分配原则。当实例...

_ZeroKing的博客 2374

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

设计模式学习——简单工厂模式

模式概述:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(SimpleFactory)模式又称为静态工厂方法(StaticFactoryMethod)模式,属于类的创建型模式,但其不属于23种GOF设计模式之一,通常它根据自变量的不同返回不同的类的实例。 UML类图: 简单工厂模式的实质是由一个工厂类根据传入的...

112

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

设计模式学习笔记--简单工厂模式(Simple Factory Pattern)【创建型模式】

简单工厂模式: 工厂是用来生成产品的,简单工厂,说明工厂能力有限因此只生成一个系列的产品。 此系列产品提供一个产品抽象,具体的产品在派生产品中进行实现。 简单工厂(一个类),用来管理这个系列产品的生产。工厂中会有一个creat(char* name)成员函数name是需要生产的具体产品名称。 调用简单工厂中的creat()函数就可以进行不同种类的产品的生产了。

shangshuai19901005的博客 466

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

学习《图说设计模式》简单工厂模式

《图说设计模式》简单工厂模式 1. 简单工厂模式( Simple Factory Pattern ) 1.1 模式动机 考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等), 这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工

Orange_Wu的博客 586

大话设计模式-简单工厂模式(学习笔记与java实现)

java学习了一段时间,对面向对象有一定的理解,但是总觉得理解不深,这几天开始看设计模式,用的是程杰的大话设计模式,但是书里的源码是C#的,自己用java来实现,也加深了java的学习。 1、简单工厂模式的定义 提供一个创建对象实例的功能,不关心它的具体实现。被创建实例的类型可以使接口、抽象类,也可以是具体的类。 2、简单工厂本质 简单工厂模式的本质就是:选择实现。重点在于选

风一样的安姑娘的专栏 871

设计模式学习系列4 简单工厂模式

         从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 1简单工厂模式结构图 简单工厂模式主要包含三部分 (1)工厂:负责根...

weixin_34324081的博客 91

简单工厂模式-设计模式学习

文字理解 简单工厂模式又 叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 简单描述 简单工厂将对象的创建过程进行了封装,用户不知道到底创建了什么对象,只需要调用工厂类,工厂类按照自己的逻辑进行创建对象。 代码理解 现在有一道面试题: 使用java实现一个计算机控制台程序,要求输入数的运算...

hellodakee的博客 160

23种设计模式学习之:简单工厂模式

简单工厂并不属于23种GOF设计模式之一,在学习其它模式之前,我们有必要了解下,这些简单的工厂模式。 简单工厂模式分为3种: 一、普通工厂模式: 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 java例子: //接口Car public interface Car { public void drive(); } //实现类Maserati public class Maser...

shun12580的博客 234

学习笔记(6):第2章 架构师内功心法之设计模式 -Simple Factory Pattern简单工厂模式...

不用设计模式并非不可以,但是用好设计模式能帮助我们更好地解决实际问题,设计模式最重要的是解耦。设计模式天天都在用,但自己却无感知。 我们把设计模式作为一个专题,主要是学习设计模式是如何总结经验的,把经验为自己所用。学设计模式也是锻炼将业务需求转换技术实现的一种非常有效的方式。 本章内容将按照创建型模式(工厂方法模式、抽象工厂模式、单例模式、原型模式、建造者模式)、结构...

weixin_43222122的博客 151

java简述工厂模式_工厂三兄弟之简单工厂模式(二):简单工厂模式概述

2简单工厂模式概述简单工厂模式并不属于GoF23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下:首先将需要创建的各种不同对象(例如各种不同的Chart对象)的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创...

weixin_27734811的博客 155

设计模式学习日记01 简单工厂模式

最近在学一些设计模式,希望写下一些笔记,能够激励自己认真学完,同时如果诸位神仙发现有什么错误,也希望诸仙能够批评指正。 简单工厂优缺点 主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。 GOOD:适用于不同情况创建不同的类时 BUG:客户端必须要知道基类和工厂类,耦合性差 简单工厂结构图 代码实现 //基类 double Operation::getResult...

Tomjeck的博客 177

设计模式学习总结之简单工厂模式

设计模式学习总结之简单工厂模式,这边的总结主要设计学习过程中的一些知识点。

YangDanYang1991的博客 511

java设计模式之简单工厂模式_java设计模式学习之简单工厂模式

简单工厂模式简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。利用简单工厂模式设计一个计算器。1:创建一个运算的类package EasyFactoryModel;abst...

weixin_36480255的博客 67
上一篇: [Android基础]Android中使用HttpURLConnection
下一篇: [Android基础]Android中如何使用Intent传递对象
陶程
博客等级 码龄12年 360粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值