码农小白 设计模式篇 简单工厂模式

本文从面试中遇到的一个面向对象设计问题出发,揭示了使用简单工厂模式的重要性。通过汽车工厂和计算机运算的例子,详细阐述了如何运用简单工厂模式降低耦合度并提高代码复用性。同时,也指出了该模式在添加新功能时可能需要修改工厂类的缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单工厂模式

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、总结

优点

  • 通过继承、封装、多态,使得我们程序的耦合度降低了。
  • 运用简单工厂模式,使得我们的程序易于复用,容易修改,便于以后对程序功能的追加

缺点

  • 在添加新功能时需要改动工厂类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值