简单工厂模式
1、面试题的 【 坑 】
面试题:
- 请你用现如今任意一种流行的面向对象语言实现一个计算机控制台程序,要求输入两个数和运算符,得出结果。
一看到这题目,我首先想到了用 switch 语句,对 运算符 进行 情况判定,然后对其数字相应操作。
下面是我的第一代实现的代码
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("请输入第一个数:");
string a = Console.ReadLine();
Console.WriteLine("请输入运算符:");
string b = Console.ReadLine();
Console.WriteLine("请输入第二个数:");
string c = Console.ReadLine();
double x = -1;
switch(b)
{
case "+":
x = Convert.ToDouble(a) + Convert.ToDouble(c);
break;
case "-":
x = Convert.ToDouble(a) - Convert.ToDouble(c);
break;
case "*":
x = Convert.ToDouble(a) * Convert.ToDouble(c);
break;
case "/":
x = Convert.ToDouble(a) / Convert.ToDouble(c);
break;
}
Console.WriteLine("结果为:" + x);
}
catch(Exception ex)
{
Console.WriteLine("程序异常:" + ex.Message);
}
}
}
输入:
5
*
6
显示结果:
请输入第一个数:
5
请输入运算符:
*
请输入第二个数:
6
结果为:30
- 首先,代码变量极度不规范
- 相信很多人和我思路应该差不多,这段代码充分的表现出我对面向对象这四个大字的忽略,写的代码都是用的面向过程的思维,一丁点的面向对象思维都体现不出,题目分明强调了用面向对象语言,这充分的暗示了我们要用面向对象的思维去解题。
- 要只就这样去面试,就算代码能运行我的名字也绝对不在入取名单内
2、用简单工厂模式实现汽车工厂
正好我的老师给我讲过汽车工厂的实现
- 首先我们抽象出一个汽车类
public class Car
{
public virtual void Show() //抽象类Car的虚方法
{
Console.WriteLine("我是汽车!");
}
}
- 然后小轿车、大卡车、救护车等分别继承 汽车类
public class MinCar
{
public override void Show() //覆盖抽象类Car的虚方法
{
Console.WriteLine("您的小轿车制造好了!");
}
}public class TruckCar
{
public override void Show() //覆盖抽象类Car的虚方法
{
Console.WriteLine("您的大卡车制造好了!");
}
}public class AmbulanceCar
{
public override void Show() //覆盖抽象类Car的虚方法
{
Console.WriteLine("您的救护车制造好了!");
}
}
- 创建汽车工厂
public class CarFactory
{
public static Car CreateCar(string modelCar)
{
Car car = null;
switch(modelCar)
{
case "小轿车":
car = new MinCar();
break;
case "大卡车":
car = new TruckCar();
break;
case "救护车":
car = new AmbulanceCar();
break;
}
return car;
}
}
- 客户端实现
class Program
{
static void Main(string[] args)
{
Console.WriteLine("我要一辆小轿车!");
Car car1 = CarFactory.CreateCar("小轿车");
car1.Show();
Console.WriteLine("我要一辆大卡车!");
Car car1 = CarFactory.CreateCar("大卡车");
car1.Show();
}
}
显示结果:
我要一辆小轿车!
您的小轿车制造好了!
我要一辆大卡车!
您的大卡车制造好了!
汽车简单工厂UML结构图:
3、用简单工厂模式实现计算机
class Operation //抽象运算类
{
private double number1 = 0;
private double number2 = 0;
public double Number1 //属性Number1
{
get{ return number1;}
set{ number1 = value;}
}
public double Number2 //属性Number2
{
get{ return number2;}
set{ number2 = value;}
}
public virtual double GetResult() //获取结果
{
double result = -1;
return result;
}
}
class AddOperation //加法类
{
public override double GetResult()
{
double result = number1 / number2;
return result;
}
}
class SubtractsOperation //减法类
{
public override double GetResult()
{
double result = number1 / number2;
return result;
}
}
class TimesOperation //乘法类
{
public override double GetResult()
{
double result = number1 / number2;
return result;
}
}
class ExceptOperation //除法类
{
public override double GetResult()
{
double result = number1 / number2;
return result;
}
}
class OperationFactory //简单运算工厂
{
public static Operation CreateOperation(string ope)
{
Operation operation = null;
switch(ope)
{
case "+":
operation = new AddOperation();
break;
case "-":
operation = new SubtractsOperation();
break;
case "*":
operation = new TimesOperation();
break;
case "/":
operation = new ExceptOperation();
break;
}
return operation;
}
}
运算工厂UML结构图:
客户端调用:
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("请输入第一个数:");
string number1 = Console.ReadLine();
Console.WriteLine("请输入运算符:");
string ope = Console.ReadLine();
Console.WriteLine("请输入第二个数:");
string number2 = Console.ReadLine();
double result;
Operation operation = OperationFactory.CreateOperation(ope);
operation.Number1 = Convert.ToDouble(number1);
operation.Number2 = Convert.ToDouble(number2);
result = operation.GetResult();
Console.WriteLine("结果为:" + result);
}
catch(Exception ex)
{
Console.WriteLine("程序异常:" + ex.Message);
}
}
}
输入值:
9
/
9
显示结果:
请输入第一个数:
9
请输入运算符:
/
请输入第二个数:
9
结果为:1
4、总结
优点
- 通过继承、封装、多态,使得我们程序的耦合度降低了。
- 运用简单工厂模式,使得我们的程序易于复用,容易修改,便于以后对程序功能的追加。
缺点
- 在添加新功能时需要改动工厂类