Skip to content
久久日记本
曾经年少爱追梦,一心只想往前飞
  • 首页
  • 博客
    • 博客历史
    • 主题
    • 个人文集
  • 关于
    • 正在读的书
    • 作品归档
    • 2018作品归档
    • 联系我
  • 友情链接
  • 留言板
❄
❅
❆
❄
❅
❆
❄
❅
❆
❄
.NET

简单工厂模式

Posted on 2013年5月16日 by 九九 / 1317 Views

1.工厂模式.

  实例:计算器

  创建方法:

首先是运算类,它有两个Number属性,用于计算计算器的前后数;

然后有一个虚方法GetResult,用于得到结果;

//运算类
{
    两个Number属性{get;set;} //主要用于计算前后数,NumA,NumB
    虚方法GetResult//用于得到结果
}

把加减乘除都写成子运算类的子类,继承它,重写了GetResult()方法,

运算类子类:运算类//运算类子类  继承  运算类
 {
    //重写GetRsult方法
    运算类子类1//这里 如果不写  就为 private
    {
        public overrive 运算方法{};
        //切记这里是public,上面一行不要加public,不加就是默认private.  加了之后会报错.访问级别导致不知道要访问overrive之前的还是现在的方法
    }
     运算类子类2
    {
        public overrive 运算方法{};
    }
    运算类子类3
    {
        public overrive 运算方法{};
    }
}

这样如果要修改任何一个算法,都不需要提供其它算法的代码了.

让计算器指导我是希望用哪一种算法:

运算类工厂
{
    public static 运算类 CreateFunction(string 传入参数)//切记前面的static不能忘了,返回值类型为  运算类
    {
        运算类 my=null;
        switch(传入参数)
        {
           case "+":
               my=new 运算子类1();
               break;
           case "-":
               my=new 运算子类2();
               break;
           case "*":
               my=new 运算子类3();
               break;
        }
           return my;//返回  运算类  类型
    }

}

在Program中调用,只要输入运算符号,用工厂实例化合适的对象,通过多台,返回父类的方式实现计算器的结果.

//Program.cs

运算类 mynew;
mynew=运算类工厂.CreateFunction("传入的值");
mynew.NumA=数字A;
mynew.Numb=数字B;
Console.WriteLine(mynew.GetResult().toString());

这样 需要增加各种复杂运算,比如平方根,立方根,自然对数,正弦余弦等,只要增加相应的运算子类就可以了.

完整代码:

/**//// <summary>
/// 运算类
/// </summary>
class Operation
{
    private double _numberA = 0;
    private double _numberB = 0;

    /**//// <summary>
    /// 数字A
    /// </summary>
    public double NumberA
    {
        get{ return _numberA; }
        set{ _numberA = value;}
    }

    /**//// <summary>
    /// 数字B
    /// </summary>
    public double NumberB
    {
        get{ return _numberB; }
        set{ _numberB = value; }
    }

    /**//// <summary>
    /// 得到运算结果
    /// </summary>
    /// <returns></returns>
    public virtual double GetResult()
    {
        double result = 0; 
        return result;
    }


}

//运算类View Code
/**//// <summary>
/// 加法类
/// </summary>
class OperationAdd : Operation
{
    public override double GetResult()
    {
        double result = 0; 
        result = NumberA + NumberB;
        return result;
    }
}

/**//// <summary>
/// 减法类
/// </summary>
class OperationSub : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA - NumberB;
        return result;
    }
}

/**//// <summary>
/// 乘法类
/// </summary>
class OperationMul : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA * NumberB;
        return result;
    }
}

/**//// <summary>
/// 除法类
/// </summary>
class OperationDiv : Operation
{
    public override double GetResult()
    {
        double result = 0;
        if (NumberB==0)
            throw new Exception("除数不能为0。");
        result = NumberA / NumberB;
        return result;
    }
}

//运算子类 View Code
/**//// <summary>
/// 运算类工厂
/// </summary>
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;
    }
}

//运算类工厂 View Code
Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();

工厂模式和策略模式的区别:

策略,从字面就好理解,意思是一种决策,所以通常它都适用于一些商务逻辑或算法等类的选择上,因此只要是一些涉及到商务逻辑(都是继承同一个抽象类的子类)的选择时,都可以考虑用策略模式。从这个角度讲,策略模式在面向对象编程中的应用可说是无处不在,它是最最常见的模式。

而简单工厂模式,主要解决的是类的实例化问题,把实例化的决策从客户端转移到工厂类当中,让客户端只是输入一个比如“字符串”这样的标识就可以通过简单工厂生成一个相应的类实例。这个模式是解决类的创建问题。

它们两者并不矛盾,因此不要有非此即彼的想法。事实上把它们结合使用会更有意义。

参考:大话设计模式

C#
九九
过去的我们,现在的自己,往事,终会随风而逝。 View all posts by 九九 →

Post navigation

Older post
20个案例掌握PL/SQL基础
Newer post
C#中的正则表达式

标签云

2019ncov Android ASP.NET Baby C# C/C++ CSS Div DX11 flask front-end GAE Git Java JJProject JS Life MSSQL MVC OpenSource Oracle Python React React-Native Software Tools Vue Webpack Website Window WP7 乱记 十年旧梦 天气 宝宝成长日记 小说 工作 情感 故障 散文 日记 网新实训笔记 花落梧桐 诗间集 转载

时光机

  • 2023年3月
  • 2023年2月
  • 2022年12月
  • 2022年4月
  • 2022年3月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年5月
  • 2019年12月
  • 2019年10月
  • 2019年9月
  • 2019年6月
  • 2019年5月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年3月
  • 2018年2月
  • 2018年1月
  • 2017年11月
  • 2017年10月
  • 2017年9月
  • 2017年7月
  • 2017年3月
  • 2017年1月
  • 2016年12月
  • 2016年11月
  • 2016年10月
  • 2016年7月
  • 2016年3月
  • 2016年2月
  • 2016年1月
  • 2015年12月
  • 2015年11月
  • 2015年10月
  • 2015年9月
  • 2015年8月
  • 2015年7月
  • 2015年4月
  • 2015年3月
  • 2015年2月
  • 2015年1月
  • 2014年12月
  • 2014年11月
  • 2014年10月
  • 2014年9月
  • 2014年8月
  • 2014年7月
  • 2014年6月
  • 2014年5月
  • 2014年4月
  • 2014年3月
  • 2014年2月
  • 2014年1月
  • 2013年12月
  • 2013年11月
  • 2013年10月
  • 2013年9月
  • 2013年8月
  • 2013年7月
  • 2013年6月
  • 2013年5月
  • 2013年4月
  • 2013年3月
  • 2013年1月
  • 2012年11月
  • 2012年10月
  • 2012年9月
  • 2012年8月
  • 2012年7月
  • 2012年6月
  • 2012年5月
  • 2012年4月
  • 2012年3月
  • 2012年2月
  • 2012年1月
  • 2011年12月
  • 2011年11月
  • 2011年10月
  • 2011年9月
  • 2011年8月
  • 2011年6月
  • 2011年5月
  • 2011年4月
  • 2011年3月
  • 2011年2月
  • 2010年12月
  • 2010年11月
  • 2010年10月
  • 2010年9月
  • 2010年8月
  • 2010年6月
  • 2010年5月
  • 2010年2月
  • 2010年1月
  • 2009年12月
  • 2009年11月
  • 2009年10月
  • 2009年9月
  • 2009年8月
  • 2009年7月
  • 2009年6月
  • 2009年5月
  • 2009年4月
  • 2009年3月
  • 2009年2月
  • 2009年1月
  • 2008年8月
  • 2008年6月
  • 2008年5月
  • 2008年4月
  • 2008年2月
  • 2007年11月
  • 2007年8月
  • 2007年6月
  • 2007年5月
  • 2007年4月
  • 2007年3月
  • 2007年2月
  • 2007年1月
  • 2006年10月
  • 2006年8月
© 2006 - 2023 久久日记本
Powered by WordPress | Theme: Graphy for 99diary