一、作业内容
使用C#编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统·管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅长沙工厂只能生产鸭脖。具体要求如下:
1.定义接口IProductionFactory,包含生产鸭脖和鸭翅的方法。
2.定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口IProductionFactory,用于具体的生产工厂。
3.使用委托 ProductionDelegate 定义生产委托。
4.在Main函数中,创建不同工厂的实例,并通过生产委托进行生产。
二、实现思路
1、定义接口IProductionFactory
首先,我们定义一个名为IProductionFactory
的接口,它包含了生产鸭脖和鸭翅的方法。接口是定义一组方法的契约,不同工厂类将实现这个接口,确保它们都有统一的生产方法。
public interface IProductionFactory
{
void ProduceDuckNeck();
void ProduceDuckWing();
}
2、WuhanFactory类的实现
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产了鸭脖。");
}
public void ProduceDuckWing()
{
Console.WriteLine("武汉工厂生产了鸭翅。");
}
}
3、NanjingFactory类的实现
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
throw new NotSupportedException("南京工厂不能生产鸭脖。");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工厂生产了鸭翅。");
}
}
4、ChangshaFactory类的实现
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产了鸭脖。");
}
public void ProduceDuckWing()
{
throw new NotSupportedException("长沙工厂不能生产鸭翅。");
}
}
5、委托定义
为了更加灵活地管理生产方法,我们定义一个名为ProductionDelegate
的委托:
public delegate void ProductionDelegate();
6、委托使用
在Main
函数中,我们创建工厂实例,并通过委托来执行生产方法:
class Program
{
static void Main(string[] args)
{
// 创建工厂实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 创建委托并绑定方法
ProductionDelegate produceDuckNeckDelegate = wuhanFactory.ProduceDuckNeck;
ProductionDelegate produceDuckWingDelegate = nanjingFactory.ProduceDuckWing;
// 执行生产
produceDuckNeckDelegate();
produceDuckWingDelegate();
// 更改委托绑定并执行
produceDuckNeckDelegate = changshaFactory.ProduceDuckNeck;
produceDuckNeckDelegate();
// 等待用户按键以关闭控制台窗口
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
通过这种方式,我们可以根据需要动态地改变委托所绑定的方法,从而实现对不同工厂生产方法的灵活调用。
三、运行结果:
四、完整代码
using System;
public interface IProductionFactory
{
void ProduceDuckNeck();
void ProduceDuckWing();
}
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产了鸭脖。");
}
public void ProduceDuckWing()
{
Console.WriteLine("武汉工厂生产了鸭翅。");
}
}
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
throw new NotSupportedException("南京工厂不能生产鸭脖。");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工厂生产了鸭翅。");
}
}
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产了鸭脖。");
}
public void ProduceDuckWing()
{
throw new NotSupportedException("长沙工厂不能生产鸭翅。");
}
}
public delegate void ProductionDelegate();
class Program
{
static void Main(string[] args)
{
// 创建工厂实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 创建生产委托并绑定方法
ProductionDelegate produceDuckNeckDelegate = wuhanFactory.ProduceDuckNeck;
ProductionDelegate produceDuckWingDelegate = nanjingFactory.ProduceDuckWing;
// 通过委托执行生产
produceDuckNeckDelegate();
produceDuckWingDelegate();
// 尝试改变委托绑定,并再次执行生产
produceDuckNeckDelegate = changshaFactory.ProduceDuckNeck;
produceDuckNeckDelegate();
// 假设我们想要用同一个委托执行不同工厂的生产方法
ProductionDelegate productionDelegate = new ProductionDelegate(wuhanFactory.ProduceDuckNeck);
productionDelegate.Invoke(); // 武汉工厂生产鸭脖
productionDelegate = new ProductionDelegate(nanjingFactory.ProduceDuckWing);
productionDelegate.Invoke(); // 南京工厂生产鸭翅
productionDelegate = new ProductionDelegate(changshaFactory.ProduceDuckNeck);
productionDelegate.Invoke(); // 长沙工厂生产鸭脖
// 等待用户按键以关闭控制台窗口
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
五、难点
1.接口设计与实现:接口设计是确保系统灵活性和可扩展性的关键。然而,随着生产活动的不断增加和变化,如何合理地定义接口方法,以及如何平衡接口的通用性和特殊性,是一个具有挑战性的难点。在设计IProductionFactory
接口时,需要确保接口中的方法能够涵盖所有工厂可能的生产活动。此外,接口的实现也需要考虑不同工厂之间的差异。
2.工厂类之间的差异处理:不同的工厂可能具有不同的生产能力,这需要在工厂类的实现中进行差异化处理。例如,某些工厂可能无法生产某些产品,这需要在相应的方法中抛出异常或进行其他错误处理。
3.委托的使用与管理:如何确保委托的正确绑定和解绑,如何避免委托链中的循环引用和内存泄漏,以及如何有效地管理多个委托之间的调用顺序和依赖关系,都是需要仔细考虑的问题。
4.异常处理:在生产过程中,可能会出现各种异常情况,例如设备故障、原料不足等。如何合理地处理这些异常,确保系统的稳定性和可靠性,是一个重要的难点。同时,为了方便问题排查和系统维护,还需要对关键操作进行日志记录。如何设计合理的日志记录机制,以便在出现问题时能够迅速定位并解决问题,也是一个需要关注的难点。
六、总结
本次作业通过C#语言实现了一个简单的周黑鸭工厂产品生产管理系统。我们定义了一个IProductionFactory接口,该接口包含了生产鸭脖和鸭翅的抽象方法。随后,我们创建了三个工厂类WuhanFactory、NanjingFactory和ChangshaFactory,它们分别实现了IProductionFactory接口,并根据实际生产能力实现了相应的方法。通过这次作业,我们加深了对C#中接口、类和委托等关键知识点的理解,并学会了如何运用它们来解决实际问题。同时,我们也体会到了面向对象编程中多态性的好处,即可以通过接口或基类来统一处理不同类型的对象,提高了代码的复用性和可扩展性。