文章目录
- 1. 作业内容
- 2. 设计思路分析与难点
- 3. 代码实现
- 3.1 接口定义
- 3.2 工厂类实现
- 3.3 委托和事件
- 3.4 主函数
- 3.5 代码运行结果
- 4. 代码地址
- 5. 总结&改进思路
- 6. 阅读参考
1. 作业内容
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口
IProductionFactory
,包含生产鸭脖和鸭翅的方法。 - 定义类
WuhanFactory
、NanjingFactory
、ChangshaFactory
分别实现接口IProductionFactory
,用于具体的生产工厂。 - 使用委托
ProductionDelegate
定义生产委托。 - 在
Main
函数中,创建不同工厂的实例,并通过生产委托进行生产。
2. 设计思路分析与难点
在面向对象编程中,接口定义了方法的规范,委托则允许在运行时选择具体的方法执行,这两者同时使用,使得不同的工厂类可以根据需要实现这些方法,增强了程序的灵活性和扩展性,提高了代码的动态性。总体上讲,该系统的设计围绕接口和委托展开。
如何处理工厂生产能力的差异性是一个较为棘手的问题,例如,南京工厂无法生产鸭翅。我们需要一种机制来优雅地处理不支持的生产操作。
我们利用接口方法的实现来体现生产能力的差异性,在不支持的方法中抛出NotImplementedException
异常。这确保了程序在尝试执行不支持的操作时会清楚地报错,使得错误处理更加明确。
如图所示:
在这里只是简单地抛出异常并且报错,并不去继续其他处理。
3. 代码实现
3.1 接口定义
interface IProductionFactory
{
void ProduceNeck();
void ProduceWing();
}
IProductionFactory
包含两个方法:ProduceNeck()
和 ProduceWing()
。这两个方法分别代表生产鸭脖和鸭翅的能力。
3.2 工厂类实现
class WuhanFactory : IProductionFactory
{public void ProduceNeck() {Console.WriteLine("Wuhan Factory produce duck neck.");}public void ProduceWing() {Console.WriteLine("Wuhan Factory produce duck wing.");}
}
class NanjingFactory : IProductionFactory
{public void ProduceNeck(){Console.WriteLine("Nanjing Factory produce duck neck.");}public void ProduceWing(){throw new NotImplementedException("Nanjing Factory has no access to produce duck wing!!!");}
}
class ChangshaFactory : IProductionFactory
{public void ProduceNeck(){throw new NotImplementedException("Changsha Factory has no access to produce duck neck!!!");}public void ProduceWing(){Console.WriteLine("Changsha Factory produce duck wing.");}
}
在这里,我们创建了三个工厂类:WuhanFactory
、NanjingFactory
和 ChangshaFactory
,每个类都实现了 IProductionFactory
接口。由于不同工厂能够生产的产品不同,我们通过用不同方式实现接口方法来体现他们在生产上的差异:
- 若是能够实现生产该类产品,则正常输出语句
xxx Factory produce duck wing.
- 若是不能生产该产品,则抛出
NotImplementedException
异常,异常信息为xxx Factory produce duck neck.
3.3 委托和事件
//定义委托
public delegate void ProductionDelegate();//定义事件
public event ProductionDelegate ExecuteOrder;
我们定义了一个名为ProductionDelegate
的委托,它不带参数且不返回值,用于封装生产方法的调用,并且定义了事件ExecuteOrder
,用于记录实现各个工厂的方法。
3.4 主函数
在 Main
方法中,我们为每个工厂实例化了相应的生产委托,并通过这些委托调用生产方法。
static void Main(string[] args)
{//分别为三个工厂类实例化IProductionFactory Wuhan_Factory = new WuhanFactory();IProductionFactory Nanjing_Factory = new NanjingFactory();IProductionFactory Changsha_Factory = new ChangshaFactory();//为每一个工厂都创建一个单独的委托ProductionDelegate wuhanProduction = Wuhan_Factory.ProduceNeck;wuhanProduction += Wuhan_Factory.ProduceWing;ProductionDelegate nanjingProduction = Nanjing_Factory.ProduceNeck;nanjingProduction += Nanjing_Factory.ProduceWing;ProductionDelegate changshaProduction = Changsha_Factory.ProduceWing;changshaProduction += Changsha_Factory.ProduceNeck;Console.WriteLine("Wuhan Factory production:");try{wuhanProduction();}catch (NotImplementedException e){Console.WriteLine(e.Message);}Console.WriteLine("Nanjing Factory production:");try{nanjingProduction();}catch (NotImplementedException e){Console.WriteLine(e.Message);}Console.WriteLine("Changsha Factory production:");try{changshaProduction();}catch (NotImplementedException e){Console.WriteLine(e.Message);}Console.ReadLine();}
除此之外,还采用try
和catch
语句块来实现订单的执行,对于每个工厂的委托,都使用了一个try-catch
语句块,能够在出现异常的时候及时抛出,并且不影响其他工厂的生产。
3.5 代码运行结果
4. 代码地址
代码仓库:https://github.com/hmcy-zbx/Windows_homework
5. 总结&改进思路
通过本次项目的练习,我们展示了如何使用 C# 中的面向对象特性来构建一个简单的实现周黑鸭多工厂生产管理系统。该系统不仅展示了接口、类和委托的使用,还体现了面向对象设计原则继承性的应用,是一次很好的练习。
在未来,还可以使用设计模式对其进行改进,利用简单工厂模式或者抽象工厂模式来实现可以使其更加接近实际生产的需求。
6. 阅读参考
C#教程-接口:csharp-interface
C#教程-委托:BV1TP411R72r
C#教程-事件:BV1ou411a7YD
简单工厂模式和抽象工厂模式:Graphic Design Patterns