一、周黑鸭工厂管理内容
工厂生产主要包括鸭脖和鸭翅,共三个工厂。武汉工厂能同时生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。
二、代码要求
需运用类、接口、委托等关键知识点。
三、主要思路
1、定义接口IProductionFactory,其中包含了鸭脖和鸭翅的方法。
2、定义三个工厂类WuhanFactory、NanjingFactory、ChangshaFactory分别实现接口IProductionFactory,用于具体的生产工厂。
3、使用委托ProductionDelegate定义生产委托。
4、在Main函数中,创建不同工厂实例,并通过生产委托进行生产。
四、代码难点
1、接口方法的实现:每个工厂类都需要根据接口定义实现生产方法。对于只能生产特定产品的工厂,需要实现接口中所有方法,但对于不能生产的产品,可能需要在方法内部实现为空操作或抛出异常。
2、委托的使用:需要理解委托的定义、创建、绑定
和调用过程。
3、异常处理:如果工厂不支持生产某种产品,那么在调用生产方法时应该考虑如何处理这种情况。可以选择抛出异常、或者返回null等。
using System;
namespace ZhouHeiYa
{
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("长沙工厂生产鸭脖");
Console.ReadLine();
}
public void ProduceDuckWing()
{
throw new NotSupportedException("长沙工厂不能生产鸭翅");
}
}
public delegate void ProductionDelegate(IProductionFactory factory);//定义生产委托
internal class Program
{
static void Main(string[] args)
{
// 创建不同工厂实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 创建生产委托
ProductionDelegate duckneck = ProduceDuckNeck;
ProductionDelegate duckwing = ProduceDuckWing;
// 使用委托调用工厂生产鸭脖和鸭翅
duckneck(wuhanFactory);
duckwing(wuhanFactory);
duckwing(nanjingFactory);
duckneck(changshaFactory);
// 尝试使用委托调用南京工厂生产鸭脖,并处理异常
try
{
duckneck(nanjingFactory);
}
catch (NotSupportedException ex)
{
Console.WriteLine(ex.Message);
}
// 尝试使用委托调用长沙工厂生产鸭翅,并处理异常
try
{
duckwing(changshaFactory);
}
catch (NotSupportedException ex)
{
Console.WriteLine(ex.Message);
}
}
// 生产鸭脖的委托方法
static void ProduceDuckNeck(IProductionFactory factory)
{
factory.ProduceDuckNeck();
}
// 生产鸭翅的委托方法
static void ProduceDuckWing(IProductionFactory factory)
{
factory.ProduceDuckWing();
}
}
}
五、代码讲解
委托的使用:
代码定义了一个名为ProductionDelegate
的委托,它接受一个IProductionFactory
类型的参数,并且没有返回值。
通过创建两个委托实例duckneck
和duckwing
,并分别将它们指向ProduceDuckNeck
和ProduceDuckWing
方法,可以实现对工厂方法的间接调用。
异常处理:
当尝试让不支持生产某种产品的工厂生产该产品时(例如,让NanjingFactory生产鸭脖或让ChangshaFactory生产鸭翅),工厂会抛出NotSupportedException异常。
代码通过使用try-catch块来捕获这些异常,并打印出异常信息,从而处理这些异常情况。