一、内容概览:
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。
二、具体要求:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
三、具体实现:
第一步:定义接口 IProductionFactory
使用interface来定义接口
public interface IProductionFactory
{
void ProduceDuckNeck();//定义鸭脖接口
void ProduceDuckWing();//定义鸭翅接口
}
第二步:定义工厂类(WuhanFactory,NanjingFactory,ChangshaFactory)
根据题目要求,不同的工厂有不同的生产能力,因此实现时需要根据具体功能进行方法的实现或者留空。
public class WuhanFactory : IProductionFactory //定义武汉工厂类
{
public void ProduceDuckNeck()
{
Console.WriteLine("Wuhan Factory produced 鸭脖.");
}
public void ProduceDuckWing()
{
Console.WriteLine("Wuhan Factory produced 鸭翅.");
}
}
public class NanjingFactory : IProductionFactory //定义南京工厂类
{
public void ProduceDuckNeck()
{
Console.WriteLine("Nanjing Factory cannot produce 鸭脖.");
} // 南京不能生产鸭脖
public void ProduceDuckWing()
{
Console.WriteLine("Nanjing Factory produced 鸭翅.");
}
}
public class ChangshaFactory : IProductionFactory //定义长沙工厂类
{
public void ProduceDuckNeck()
{
Console.WriteLine("Changsha Factory produced 鸭脖.");
}
public void ProduceDuckWing()
{
Console.WriteLine("Changsha Factory cannot produce 鸭翅.");
} //长沙不能生产鸭翅
}
在第二步中,分别定义了武汉,南京,长沙类,同时通过冒号语法,将三个类都继承于接口IProductionFactory。
第三步:定义生产委托ProductionDelegate
定义委托可以允许我们更灵活地引用和执行方法。若在生产场景中使用委托,可以定义一个特定签名的委托,用来代表各种生产行为。 通过委托,可以在不直接调用方法的情况下引用方法,这为程序设计提供了更大的灵活性和解耦能力。
public delegate void ProductionDelegate();
第四步:使用 Main 函数进行测试
在主函数中,我们将创建不同工厂的实例,然后利用委托指向对应的生产方法,模拟生产流程。
class Program
{
static void Main(string[] args)
{
// 实例化工厂
WuhanFactory wuhanFactory = new WuhanFactory();
NanjingFactory nanjingFactory = new NanjingFactory();
ChangshaFactory changshaFactory = new ChangshaFactory();
// 利用委托进行生产(将方法绑定到委托实例)
ProductionDelegate wuhanProductionNeck = new ProductionDelegate(wuhanFactory.ProduceDuckNeck);
ProductionDelegate wuhanProductionWing = new ProductionDelegate(wuhanFactory.ProduceDuckWing);
ProductionDelegate nanjingProductionWing = new ProductionDelegate(nanjingFactory.ProduceDuckWing);
ProductionDelegate changshaProductionNeck = new ProductionDelegate(changshaFactory.ProduceDuckNeck);
// 执行生产(使用委托实例来调用方法)
Console.WriteLine("Wuhan Factory Production:");
wuhanProductionNeck();
wuhanProductionWing();
Console.WriteLine("\nNanjing Factory Production:");
nanjingProductionWing();
Console.WriteLine("\nChangsha Factory Production:");
changshaProductionNeck();
}
}
在第四步的代码中,我们的具体实现步骤可以总结为以下三步:
- 实例化工厂对象。
- 将方法绑定到委托实例。
- 使用委托实例来调用方法。
实际运行结果如下:
四、功能扩展
第五步:增加工厂选择功能
在实际应用中,因为不同工厂的生产产品具有重叠性,用户与工厂之间的距离需求等,可能需要根据用户输入或某种条件动态选择工厂进行生产。这可以通过工厂模式(Factory Pattern)来实现更灵活的工厂选择。
public class FactorySelector
{
public static IProductionFactory GetFactory(string location)
{
switch(location)
{
case "Wuhan":
return new WuhanFactory();
case "Nanjing":
return new NanjingFactory();
case "Changsha":
return new ChangshaFactory();
default:
throw new ArgumentException("输入错误.");
}
}
}
在 Main 函数中利用此选择功能:
static void Main(string[] args)
{
//选择工厂位置
string factoryLocation = "Wuhan"; // 这里我直接选的“Wuhan”,实际上应该通过输入或是其他方式
IProductionFactory selectedFactory = FactorySelector.GetFactory(factoryLocation);
// 直接调用方法(未使用委托)
selectedFactory.ProduceDuckNeck();
selectedFactory.ProduceDuckWing();
}
运行结果如下:
第六步:定义异常类
在真实的系统中,生产过程可能会遇到各种异常情况(如原料不足、机器故障等)。因此,在编写生产逻辑时,加入异常处理机制是非常必要的,以保证系统可靠性和健壮性。
public class MainClass
{
public static void Main(string[] args)
{
try
{
// 实例化工厂对象
var wuhanFactory = new WuhanFactory();
var nanjingFactory = new NanjingFactory();
var changshaFactory = new ChangshaFactory();
// 将方法绑定到委托实例
ProductionDelegate wuhanProductionNeck = new ProductionDelegate(wuhanFactory.ProduceNeck);
ProductionDelegate wuhanProductionWing = new ProductionDelegate(wuhanFactory.ProduceWing);
ProductionDelegate nanjingProductionWing = new ProductionDelegate(nanjingFactory.ProduceWing);
ProductionDelegate changshaProductionNeck = new ProductionDelegate(changshaFactory.ProduceNeck);
// 执行生产操作
Console.WriteLine("Wuhan Factory Production:");
wuhanProductionNeck();
wuhanProductionWing();
Console.WriteLine("\nNanjing Factory Production:");
nanjingProductionWing();
Console.WriteLine("\nChangsha Factory Production:");
changshaProductionNeck();
}
catch (InsufficientMaterialsException e)
{
// 处理原料不足的异常
Console.WriteLine($"生产中断: {e.Message}");
}
catch (MachineFailureException e)
{
// 处理机器故障的异常
Console.WriteLine($"生产中断: {e.Message}");
}
catch (Exception e)
{
// 处理其它未预料到的异常
Console.WriteLine($"发生未知错误: {e.Message}");
}
finally
{
// 总是执行的清理代码
Console.WriteLine("生产尝试完成,进行清理和资源释放。");
}
}
}
public class InsufficientMaterialsException : Exception //异常类1
{
public InsufficientMaterialsException(string message) : base(message) {}
}
public class MachineFailureException : Exception //异常类2
{
public MachineFailureException(string message) : base(message) {}
}
以上的代码中try中内容与测试一致。在生产流程中加入异常处理机制时,使用 try-catch
语句来捕获和处理可能发生的异常。创建了两个自定义异常类:InsufficientMaterialsException
和 MachineFailureException
。当生产过程中出现原料不足或机器故障时,可以抛出自定义的异常,从而让异常处理更加具体和有针对性。这样做有助于确保程序在遇到错误时不会意外崩溃,允许记录错误信息或采取其他应对措施。
运行结果如下: