一:作业内容
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。
二:作业要求
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
三:各部分代详解
1.定义接口
1.创建一个接口 IProductionFactory
,用于定义工厂应该具备的生产能力;
2.在这个接口中,定义两个方法:ProduceDuckNeck
和 ProduceDuckWing
,分别用于生产鸭脖和鸭翅。
代码如下:
public interface IProductionFactory
{
void ProduceDuckNeck();
void ProduceDuckWing();
//此处定义了ProduceDuckNeck 和 ProduceDuckWing两个方法,分别代表生产鸭脖和鸭翅。
}
关于此代码中关于接口的作用:
在上述代码中,接口(
IProductionFactory
)的定义了一个生产工厂的契约,它规定了工厂应该能够执行的行为——鸭脖和鸭翅的具体分工生产。除此之外;我们通过对接口的定义,还可以帮助我们获得如下的优势:
多态性:通过接口,我们可以创建不同类型的工厂对象(如武汉工厂、南京工厂和长沙工厂),并且将它们赋值给同一类型的接口变量。然后,我们可以使用接口变量来调用工厂的方法,而不需要关心具体的工厂类型。这种多态性使得代码更加通用和易于扩展。
扩展性:如果将来需要添加新的生产方法,只需要在接口中添加相应的方法声明,然后更新实现接口的类以提供这些方法的具体实现。这样,所有使用接口的代码都将能够自动获得这些新方法,而无需进行大量修改。
在上述的代码中,
WuhanFactory
、NanjingFactory
和ChangshaFactory
分别实现了IProductionFactory
接口,并提供了具体的生产方法实现。所以在后续的Main
函数中,我们在创建了这些工厂的实例之后,可以通过委托调用它们的方法。
2.实现接口(具体各工厂类)
1.根据不同的工厂(武汉工厂、南京工厂、长沙工厂)创建具体的类,并实现
IProductionFactory
接口;2.在每个具体工厂类中,实现接口定义的方法。对于不能生产的产品,可以抛出异常或者简单地留空方法体。
武汉工厂(WuhanFacrory)
//武汉工厂:可生产鸭脖和鸭翅
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("武汉工厂生产鸭翅");
}
}
南京工厂(NanjingFactory)
//南京工厂:只能生产鸭翅
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
throw new NotImplementedException("南京工厂不能生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工厂生产鸭翅");
}
}
长沙工厂(ChangshaFactory)
//长沙工厂:只能生产鸭脖
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产鸭脖");
}
public void ProduceDuckWing()
{
throw new NotImplementedException("长沙工厂不能生产鸭翅");
}
}
3.委托定义
1.定义一个委托
ProductionDelegate
,其类型与工厂类中的生产方法签名一致;2.委托允许我们将方法作为参数传递,并且在我们需要时可以调用它们。
public delegate void ProductionDelegate();
4.主函数代码的实现
在
Main
函数中:
- 创建了各个工厂类的实例;
- 定义了两个委托实例
produceDuckNeck
和produceDuckWing
,并将它们与包装方法produceDuckNeckWrapper
和produceDuckWingWrapper;
- 通过委托实例调用工厂的生产方法。当调用不能生产特定产品的工厂方法时,会抛出
NotImplementedException
异常,并在try-catch
块中捕获处理。
class Program
{
static void Main(string[] args)
{
// 创建工厂实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 定义委托实例
ProductionDelegate produceDuckNeck = new ProductionDelegate(ProduceDuckNeck);
ProductionDelegate produceDuckWing = new ProductionDelegate(ProduceDuckWing);
// 通过委托调用工厂的生产方法
produceDuckNeck(wuhanFactory); // 武汉工厂生产鸭脖
produceDuckWing(wuhanFactory); // 武汉工厂生产鸭翅
try
{
produceDuckNeck(nanjingFactory); // 南京工厂不能生产鸭脖,会抛出异常
}
catch (NotImplementedException ex)
{
Console.WriteLine(ex.Message);
}
produceDuckWing(nanjingFactory); // 南京工厂生产鸭翅
produceDuckNeck(changshaFactory); // 长沙工厂生产鸭脖
try
{
produceDuckWing(changshaFactory); // 长沙工厂不能生产鸭翅,会抛出异常
}
catch (NotImplementedException ex)
{
Console.WriteLine(ex.Message);
}
}
}
四:代码运行结果
五:作业小结
难点:
接口设计的合理性:设计接口时,需要确保接口的方法能够完整地表达工厂的行为。
实现类的逻辑复杂性:每个实现类都需要根据自身的业务逻辑来实现接口中的方法。
多态性的理解与应用:多态性是面向对象编程的重要特性之一,但在实际应用中,需要深入理解其原理并正确地使用。在代码中,需要确保使用接口引用来操作对象,以便能够利用多态性的优势。
委托的使用与理解:需要理解委托的定义、使用场景以及如何将方法作为参数传递。在代码中,需要正确地创建委托实例并调用其指向的方法。代码中使用了委托(Func<string>)来间接地调用工厂的方法。委托允许将方法作为参数传递,增加了代码的灵活性和可重用性。在
Main
函数中,通过委托的实例来调用工厂的生产方法,并将结果打印出来。