两种设计模式(1)==>>“简单工厂”

我们以做一个计算器为例,给大家介绍简单工厂的应用:

效果:

这里我们使用 继承 ,虚方法, 简单工厂的设计模式来完成

首先,我们除了搭好窗体外,我们应该把我们的一些类准备好:

1.计算的父类Calculation

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 计算器_简单工厂_
{
    //父类(虚)  计算类
   public abstract class Calculation
    {
       //第一个操作数
        public double Numleft { get; set; }
       //第二个操作数
        public double NumRight { get; set; }
       //运算符
        public string Operator { get; set; }
       //虚方法
        public abstract double Cal();
    }
}

2.然后就是,加,减,乘,除 的子类

01.加法类 Add

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 计算器_简单工厂_
{
    //加法
   public class Add:Calculation
    {
       public override double Cal()
        {
            double result = Numleft + NumRight;
            return result;
        }
    }
}

02.减法类 Sub

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 计算器_简单工厂_
{
    //减法
   public  class Sub:Calculation
    {
       public override double Cal()
       {
           double result = Numleft - NumRight;
           return result;
       }
    }
}

03.乘法类 Mul

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 计算器_简单工厂_
{
    //减法类
    public  class Mul:Calculation
    {
        public override double Cal()
        {
            double result = Numleft * NumRight;
            return result;
        }
    }
}

04.除法类 Div

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 计算器_简单工厂_
{
    //除法类
   public class Div:Calculation
    {
       public override double Cal()
       {
           //除法中 除数是不能为0
           if (NumRight==0)
           {
               throw new Exception("除数不能为0");
           }
           double result = Numleft / NumRight;
           return result;
       }
    }
}

3.最后就是准备 “简单工厂” 的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 计算器_简单工厂_
{
    //工作类
   public  class Factory
    {
       public static Calculation Cal(string ope)
       {
           //初始化父类对象
           Calculation calculation = null;
           //根据传来的运算符实例化
           switch (ope)
           {
               case"+":
                   calculation = new Add();
                   break;
               case "-":
                   calculation = new Sub();
                   break;
               case "*":
                   calculation = new Mul();
                   break;
               case "/":
                   calculation = new Div();
                   break;

           }
           //返回实例化的对象
           return calculation;
       }
    }
}

4.一切准备好后,我们来看看在窗体中是如何用的呐!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 计算器_简单工厂_
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }
        private void btnCal_Click(object sender, EventArgs e)
        {
            //外层try作用:判断输入的操作数是否正确
            try
            {
                //分别获得要计算的值
                double num1 = Convert.ToDouble(txtLift.Text);
                double num2 = Convert.ToDouble(txtRight.Text);
                string ope = cmbstring.Text;
                //把获得的运算符传达“简单工厂”
                Calculation cal = Factory.Cal(ope);
                double result = 0;

                //赋值(最会忘记)
                cal.Numleft = num1;
                cal.NumRight = num2;

                //内层try作用:判断当除法时除数是否为0
                try
                {
                    //知道需求,开始进行相应工作
                    result = cal.Cal();
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.Message);
                }
               //显示结果
                label1.Text = result.ToString();
            }
            catch (Exception ex)
            {
                //如果输入不正确,则系统会提示“输入字符串的格式不正确”
                MessageBox.Show(ex.Message);

            }

        }
    }
}

我们来总结一下我们“简单工厂”类的一些注意点吧:

1.方法是静态的,调用的时候不需要实例化

2.方法的返回值是父类 类型

3.方法是有参的

时间: 2024-12-18 22:19:38

两种设计模式(1)==>>“简单工厂”的相关文章

[设计模式]两种方法实现简单工厂模式

<!--完整代码下载链接:点击下载完整代码示例--> 1.描述 在项目开发中经常会遇到根据不同的条件创建不同的对象,然后对该对象进行操作,一般都包括许多的switch -case分支如下: CBase* pBase(NULL); switch (type_variable) { case obj1: pBase = new CBaseDerivate1();break; case obj2: pBase = new CBaseDerivate2();break; ... case objN:

23种设计模式(2)-简单工厂模式

这些设计模式都是在这么多年的软件开发中,先辈对软件重构的经验总结提炼的结果,这些设计模式要遵循软件设计的六原则.每一种设计模式都有相应的需求场景的.有了这些设计模式的思想和面向对象的思想,在软件设计特定的需求中会给你解决思路. 一,需求场景 在此,我也借用书上看到的一个例子.计算器工厂给我们留了一些任务,设计一个计算器做成成品卖给买家.但是这个任务是分两个阶段让我们实现的.如下: 阶段一:买家目前只需要计算器具有加减程序的功能即可.别的功能待市场需求再做设计.也就是阶段二的任务. 阶段二:阶段一

23种设计模式之简单工厂

简单工厂模式描述的是,通过类的继承关系,父类(工厂类)与子类(产品类),调用父类中的方法,实际干活儿的是子类中的方法:封装需求的不确定性,做出通用的编程,下面以常用的计算器为例: 最容易想到的写法是: 1 Console.WriteLine("请输入操作数1:"); 2 double a = double.Parse(Console.ReadLine()); 3 Console.WriteLine("请输入操作符:"); 4 string opt = Console

23种设计模式之简单工厂模式

模式是基于在面对对象的思想上实现的计算机编程模式思维面对对象的模式思维有四大好处:可维护,可复用,可拓展,灵活性好基于三个步骤,封装,继承,多态举个例子:计算机要完成两个数字之间的运算一.就要考虑到定义一个可被继承类1.需要两个数的字段并且将之属性化2. 一个virtual的虚方法在每一个运算方法中都可以实现调用 二.要将运算的方法类继承,完成运算方法 三.创建工厂类,将根据运算符号来判断使用哪种运算类 四.在客户端中使用多态调用工厂类,输出结果就OK了 具体代码如下: 原文地址:https:/

重头开始学23种设计模式:三大工厂(简单工厂,工厂方法,抽象工厂)

在开发当中我们经常会使用三个设计模式,来帮我们解决项目代码的可扩展性. 在简单工厂,工厂方法,抽象工厂这三个设计模式当中,代码其实都很简单,主要是要理解运用. 简单工厂: 简单工厂说白了,就是利用Switch根据传递的参数,进行实例化. 工厂方法: 工厂方法,为解决每次都去增加Swicth的简单工厂的升级.为每一个产品提供一个工厂类. 抽象工厂: 抽象工厂,我觉得也是对工厂方法的再次升级,工厂方法每次只能创作一个产品,而抽象工厂就是产品线的产品族. 总结下,从网上找到一个大牛的回复: 我认为不能

Spring 实现两种设计模式:工厂模式和单态模式

在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工厂模式可将Java 对象的调用者从被调用者的实现逻辑中分离出来,调用者只需关心被调用者必须满足的规则(接口) ,而不必关心实例的具体实现过程.这是面向接口编程的优势,能提高程序的解耦,避免所有的类以硬编码方式耦合在一起. 如果所有的类直接耦合,极易形成"骨牌效应",假如B 类调用了A 类,一旦A 类需要修改,则B 类也需要修改:假如C 类调用了B 类,则C 类也需要修改......依次类推,从而导致整个系统都需要改写

初识设计模式之--简单工厂

作为一个刚刚入门的菜鸟.虽只学到了些许编程语言的皮毛(或者连皮毛都算不上),但是随着时间和学习的深入,"设计模式"这一专业术语便慢慢浮现在眼前. 到底何为设计模式呢?它的出现将会给我们带来哪些帮助?......等等一系列问题便会出现在我们脑海中.俗话说:问题才是探究知识的钥匙.就让我们带着 自己的疑问一同来学习设计模式. 首先,我们先来认识一下什么是设计模式,以及运用设计模式的优点. 设计模式的简单理解:模式是在某一背景下某个问题的一种解决方案.1.复用解决方案——通过复用已经公认的设

设计模式 之 简单工厂与工厂方法

    最近开始学习<大话设计模式>,作者以通俗的方式来讲解,还有故事情节,幽默的对白,给人耳目一新的感觉.非常喜欢作者的这种步步深入,循循善诱的方式.学习了就要总结,总结的时候自己也学着作者的方式,以自己生活中的小例子来实现我们的设计模式.下面就开始我们的第一讲<简单工厂和工厂方法>.     前两天带着一个老乡去吃饭,当然,作为一个四川人,去外边吃饭当然是点我们著名的川菜!下面先用简单工厂来实现一下: using System; using System.Collections

设计模式之简单工厂和单例模式

近段时间发现自己越来越懒了,老师早就讲过的东西,一直没有总结!百度了一下,给的答案是设计模式总共23种.简单工厂属于其中一种,而单例模式并不是其中一种.今天总结下使用这两种模式写的项目. 设计模式:设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一