一.作业内容
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
二.接口的定义与实现
2.1定义生产鸭脖和鸭翅的接口
首先我们定义一个接口IProductionFactory,包含生产鸭脖和鸭翅的方法。
public interface IProductionFactory
{
void ProduceDuckNeck();
void ProduceDuckWings();
}
2.2创建三个工厂类
我们创建三个工厂类:WuhanFactory、NanjingFactory 和 ChangshaFactory,它们分别实现了 IProductionFactory 接口。每个工厂类根据自己的能力提供具体的产品生产实现。
// 武汉工厂,能生产鸭脖和鸭翅
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产鸭脖");
}
public void ProduceDuckWings()
{
Console.WriteLine("武汉工厂生产鸭翅");
}
}
// 南京工厂,只能生产鸭翅
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
throw new NotImplementedException("南京工厂不能生产鸭脖");
}
public void ProduceDuckWings()
{
Console.WriteLine("南京工厂生产鸭翅");
}
}
// 长沙工厂,只能生产鸭脖
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产鸭脖");
}
public void ProduceDuckWings()
{
throw new NotImplementedException("长沙工厂不能生产鸭翅");
}
}
注意,南京工厂不能生产鸭脖,所以它的 ProduceDuckNeck 方法会抛出一个 NotSupportedException 异常。同样,长沙工厂不能生产鸭翅,所以它的 ProduceDuckWings 方法也会抛出异常。
为了增强代码的灵活性和可扩展性,我们还定义了一个生产委托 ProductionDelegate,它表示没有参数且没有返回值的委托。这个委托可以用来动态地调用不同工厂的生产方法。
三.委托的引入与应用
3.1生产委托
为了增强代码的灵活性和可扩展性,我们还定义了一个生产委托 ProductionDelegate,它表示没有参数且没有返回值的委托。这个委托可以用来动态地调用不同工厂的生产方法。
public delegate void ProductionDelegate();
3.2 委托生产
现在,我们可以在Main函数中创建不同工厂的实例,并通过生产委托进行产品的生产。
class Program
{
static void Main(string[] args)
{
// 创建不同工厂的实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 使用生产委托进行生产
try
{
ProduceProduct(wuhanFactory, "鸭脖");
ProduceProduct(wuhanFactory, "鸭翅");
ProduceProduct(nanjingFactory, "鸭翅");
// 长沙工厂不能生产鸭翅,会抛出异常
// ProduceProduct(changshaFactory, "鸭翅");
ProduceProduct(changshaFactory, "鸭脖");
}
catch (NotSupportedException ex)
{
Console.WriteLine($"生产失败: {ex.Message}");
}
Console.WriteLine("所有产品生产完成。");
Console.ReadLine();
}
3.3 处理异常
ProduceProduct 方法接收一个工厂实例和一个产品类型字符串作为参数。它使用了一个 switch 语句来根据产品类型选择调用哪个生产方法。如果工厂不能生产指定的产品,会捕获并打印出异常信息。
static void ProduceProduct(IProductionFactory factory, string productType)
{
ProductionDelegate produceDelegate = null;
switch (productType)
{
case "鸭脖":
produceDelegate = factory.ProduceDuckNeck;
break;
case "鸭翅":
produceDelegate = factory.ProduceDuckWings;
break;
default:
// 不支持的产品类型
return;
}
if (produceDelegate != null)
{
try
{
// 调用生产方法
produceDelegate.Invoke();
}
catch (Exception ex)
{
// 处理异常
}
}
}
在 Main 函数中调用 ProduceProduct 时,我们故意尝试让长沙工厂生产鸭翅,这会导致一个 NotSupportedException 异常被抛出。通过捕获这个异常,我们可以处理这种情况,而不是让程序崩溃。
四.代码实现与结果
4.1完整代码
using System;
// 定义生产委托
public delegate void ProductionDelegate();
// 定义产品接口
public interface IProductionFactory
{
void ProduceDuckNeck();
void ProduceDuckWings();
}
// 武汉工厂,能生产鸭脖和鸭翅
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产鸭脖");
}
public void ProduceDuckWings()
{
Console.WriteLine("武汉工厂生产鸭翅");
}
}
// 南京工厂,只能生产鸭翅
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
throw new NotSupportedException("南京工厂不能生产鸭脖");
}
public void ProduceDuckWings()
{
Console.WriteLine("南京工厂生产鸭翅");
}
}
// 长沙工厂,只能生产鸭脖
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产鸭脖");
}
public void ProduceDuckWings()
{
throw new NotSupportedException("长沙工厂不能生产鸭翅");
}
}
class Program
{
static void Main(string[] args)
{
// 创建不同工厂的实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 使用生产委托进行生产
try
{
ProduceProduct(wuhanFactory, "鸭脖");
ProduceProduct(wuhanFactory, "鸭翅");
ProduceProduct(nanjingFactory, "鸭翅");
// 长沙工厂不能生产鸭翅,会抛出异常
// ProduceProduct(changshaFactory, "鸭翅");
ProduceProduct(changshaFactory, "鸭脖");
}
catch (NotSupportedException ex)
{
Console.WriteLine($"生产失败: {ex.Message}");
}
Console.WriteLine("所有产品生产完成。");
Console.ReadLine();
}
static void ProduceProduct(IProductionFactory factory, string productType)
{
ProductionDelegate produceDelegate = null;
switch (productType)
{
case "鸭脖":
produceDelegate = factory.ProduceDuckNeck;
break;
case "鸭翅":
produceDelegate = factory.ProduceDuckWings;
break;
default:
Console.WriteLine("不支持的产品类型。");
return;
}
if (produceDelegate != null)
{
try
{
produceDelegate.Invoke();
}
catch (Exception ex)
{
Console.WriteLine($"在生产 {productType} 时出错: {ex.Message}");
}
}
}
}
4.2结果
五.难点分析与结论
5.1难点分析
1.委托的理解与使用:在这个示例中,ProductionDelegate 委托用于指向工厂类中的生产方法。对于我来说,理解委托的概念以及如何使用它是一个难点。需要弄清楚委托的定义、声明、实例化以及调用的过程。
2.接口与多态性的应用:IProductionFactory 接口定义了工厂类必须实现的方法。通过接口,我们可以确保所有工厂类都遵循相同的规范,并且在运行时,可以通过接口类型的变量来调用具体工厂类的实现。多态性是面向对象编程的四大特性之一,但理解和应用它可能需要一些时间和实践。
3.异常处理:在示例中,某些工厂类可能不支持生产特定的产品,因此会抛出 NotSupportedException。
5.2结论
这个示例展示了C#中委托、接口、多态性和异常处理等多个重要概念的应用,同时也展示了工厂设计模式的基本实现。通过学习和实践这个示例,开发者可以加深对C#语言特性和面向对象编程原则的理解,提高编写高质量代码的能力。同时,通过应用工厂模式,可以提高代码的灵活性和可维护性,使得系统更加易于扩展和修改。然而,理解和掌握这些概念和模式需要一定的时间和实践,开发者需要不断地学习和实践才能熟练掌握它们。