简单工厂模式
背景需求:
用面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
标准:
代码规范,通过封装、继承、多态把程序的耦合度降低,程序灵活,易于修改和复用。
主要类图:
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();
}