Windows程序设计课程作业-1


1. 作业内容

  使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:

  • 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
  • 定义类 WuhanFactoryNanjingFactoryChangshaFactory 分别实现接口 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.");
    }
}

  在这里,我们创建了三个工厂类:WuhanFactoryNanjingFactoryChangshaFactory,每个类都实现了 IProductionFactory 接口。由于不同工厂能够生产的产品不同,我们通过用不同方式实现接口方法来体现他们在生产上的差异:

  • 若是能够实现生产该类产品,则正常输出语句xxx Factory produce duck xxx.
  • 若是不能生产该产品,则抛出NotImplementedException异常,异常信息为xxx Factory has no access to produce duck xxx.

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();

}

  除此之外,还采用trycatch语句块来实现订单的执行,对于每个工厂的委托,都使用了一个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

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值