简单工厂VS工厂方法

简单工厂模式

背景需求:

用面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。

标准:

代码规范,通过封装、继承、多态把程序的耦合度降低,程序灵活,易于修改和复用。

主要类图

1、加减乘除类继承Operation运算类

2、简单运算工厂类作为一个单独的类,用来创造实例。

代码部分如下:

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("请输入数字A:");
                string strNumberA = Console.ReadLine();
                Console.WriteLine("请选择运算符号(+、-、*、/):");
                string strOperate = Console.ReadLine();
                Console.WriteLine("请输入数字B:");
                string strNumberB = Console.ReadLine();
                string strResult = "";
                strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate));
                Console.WriteLine("结果是:" + strResult);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("您输入有错:" + ex.Message);
            }
        }
    }
    //业务逻辑和界面逻辑分开
    //Operation运算类
    public class Operation
    {
        public static double GetResult(double numberA, double numberB, string operate)
        {
            double result = 0d;
            switch (operate )
            {
                case "+":
                    result =numberA +numberB;
                    break;
                case "-":
                    result =numberA -numberB;
                    break;
                 case "*":
                    result =numberA*numberB;
                    break;
                 case "/":
                    result =numberA/numberB;
                    break;
            } 
            return  result;
        }
       
    }
}


运行结果:

其结构图为:



而类似的例子在工厂方法模式的结构图为



工厂方法模式

背景需求:雷锋依然在人间。

1、雷锋帮老人扫地、洗衣、买米等


//雷锋类
    class LeiFeng
    {
        public void Sweep()
        {
            Console.WriteLine ("扫地");
        }

        public void Wash()
        { 
            Console.WriteLine("洗衣");
        }

        public void BuyRice()
        {
            Console.WriteLine("买米");
        }
    }
2、三个学雷锋的大学生要代替他去做这些事情,并且大学生总要毕业的,这时候就要社区志愿者来帮忙干同样的事情了。
 //学雷锋的大学生,继承“雷锋”
    class Undergraduate : LeiFeng
    { }
    //社区志愿者
    class Volunteer : LeiFeng
    { }

3、简单工厂类

//简单雷锋工厂类
    class SimpleFactory
    {
        public static LeiFeng CreateLeiFeng(string type)
        {
            LeiFeng result = null;
            switch (type )
                {
                    case  "学雷锋的大学生":
                    result =new Undergraduate ();
                    break ;
                    case "社区志愿者":
                    result =new Volunteer ();
                    break ;
                }
                    return result ;
        }
    }

4、每次实例化的时候写出这个工厂的代码,为了避免重复,我们尝试用工厂方法模式写一遍。

 //雷锋工厂
    interface IFactory
    {
        LeiFeng CreateLeiFeng();
    }

    //学雷锋的大学生工厂
    class UndergraduateFactory : IFactory
    {
        public LeiFeng CreateLeiFeng()
        {
            return new Undergraduate();
        
        }
    }

    //社区志愿者工厂
    class VolunteerFactory : IFactory
    {
        public LeiFeng CreateLeiFeng()
        {
            return new Volunteer();
        }
    }

5、客户端调用

 static void Main(string[] args)
        {
            
            //工厂方法模式
            IFactory factory = new UndergraduateFactory();
            LeiFeng student = factory.CreateLeiFeng();

            student.BuyRice();
            student.Sweep();
            student.Wash();
        }


运行结果:

posted @ 2014-03-15 17:16  Sherry&Yang  阅读(204)  评论(0编辑  收藏  举报