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

Posted 无聊想被打

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两种设计模式==>>“简单工厂”相关的知识,希望对你有一定的参考价值。

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

效果:

技术分享

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

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

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.方法是有参的

以上是关于两种设计模式==>>“简单工厂”的主要内容,如果未能解决你的问题,请参考以下文章

《疯狂学习之Java设计模式之简单工厂模式》

一. 抽象工厂&工厂方法&简单工厂方法

案例分析:设计模式与代码的结构特性

抽象工厂模式(13)

简单工厂模式

[设计模式]简单工厂模式