目录
目录
前言
在本博客中,使用C#编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。
一、设计思路
首先定义接口IProductionFactory,其中包含两个方法:生产鸭脖ProduceDuckNeck和生产鸭翅ProduceDuckWing。接着创建三个类WuhanFactory、NanjingFactory和ChangshaFactory,分别实现IProductionFactory接口,每个类都重写接口里面的方法,根据工厂各自的能力实现具体的生产。定义委托ProductionDelegate,其类型与接口IProductionFactory中的方法相匹配来指向方法。在Main函数中,创建这三个工厂类的实例,并分别定义生产鸭脖和鸭翅的委托,让后将这些委托与工厂方法相对应,通过委托调用生产方法,实现不同工厂的产品生产。
二、难点分析
1.接口的定义与实现
需要正确定义IProductionFactory接口,确保它包含生产鸭脖和鸭翅的方法,每个工厂类需要实现IProductionFactory接口,并根据工厂的实际情况实现生产方法。例如,南京工厂不能生产鸭脖,因此其实现中鸭脖的生产方法可能需要特殊处理。
2.委托的使用
在 Main 函数中,如何将工厂的方法绑定到委托上,并通过委托来调用生产方法,是委托使用的一个关键点。
3.代码的组织
合理地组织代码,使得类、接口、委托之间的关系清晰明了,也是这道题目的一个难点。需要确保代码结构清晰、易于维护,并遵循良好的编程规范。
三、定义接口
1.接口
在C#中,接口(Interface)是一个引用类型,它定义了一组方法的契约,但不实现这些方法的具体内容。接口定义了一个对象的行为规范,即这个对象能做什么,但不指定如何做。接口可以由类或其他接口来实现。实现接口的类必须提供接口中定义的所有方法的实现。
2.代码实现
using System;
// 定义生产工厂接口
public interface IProductionFactory
{
//生产鸭脖
void ProduceDuckNeck();
//生产鸭翅
void ProduceDuckWing();
}
四、定义类
1.通过实现接口来创建类的好处
(1)定义规范
目录
接口为类定义了一组方法的规范,即类中必须实现接口中声明的所有方法,保证实现接口的类都能遵循相同的行为模式,从而提高了代码的一致性。
(2)模块化
通过接口,我们可以将类的实现细节隐藏起来,只暴露必要的接口给外部使用,使得代码更加模块化。当类的内部实现发生变化时,只要接口保持不变,其他依赖该接口的代码就无需修改,提高了代码的稳定性和可维护性。
(3)扩展性
接口为代码的扩展提供了便利。当需要添加新功能或修改现有功能时,我们可以通过定义新的接口或扩展现有接口来实现。这样,我们可以在不修改现有类的情况下,为应用程序添加新功能或修改现有功能。
1.代码实现
(1)武汉工厂类
//武汉工厂:既可以生产鸭脖也可以生产鸭翅
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("武汉工厂生产鸭翅");
}
}
(2)南京工厂类
// 南京工厂:只能生产鸭翅
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("南京工厂无法生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工程生产鸭翅");
}
}
(3)长沙工厂类
// 长沙工厂:只能生产鸭脖
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("长沙工厂无法生产鸭翅");
}
}
五、定义生产委托
1.委托
在C#中,委托是一个非常重要的概念,它是实现回调方法、异步编程、事件处理程序和Lambda表达式等关键技术的基础。委托是一个类型,它描述了一个方法的签名,即方法的参数类型和返回类型。可以将其视为一个指向方法的引用,使得我们可以像使用函数指针一样调用这些方法。
2.代码实现
// 定义生产委托
public delegate void ProductionDelegate();
六、通过生产委托进行生产
1.代码实现
class Program
{
static void Main(string[] args)
{
// 创建不同工厂的实例
IProductionFactory wuhanfactory = new WuhanFactory();
IProductionFactory nanjingfactory = new NanjingFactory();
IProductionFactory changshafactory = new ChangshaFactory();
// 定义并绑定生产委托
//1.相应任务:鸭脖委托/鸭翅委托
ProductionDelegate duckneckproduce = new ProductionDelegate(wuhanfactory.ProduceDuckNeck);
duckneckproduce += changshafactory.ProduceDuckNeck;
ProductionDelegate duckwingproduce = new ProductionDelegate(wuhanfactory.ProduceDuckWing);
duckwingproduce += nanjingfactory.ProduceDuckWing;
//调用委托
Console.WriteLine("——————能生产鸭脖的工厂——————");
duckneckproduce();
Console.WriteLine("——————能生产鸭翅的工厂——————");
duckwingproduce();
//2.相应工厂:武汉工厂委托/南京工厂委托/长沙工厂委托
ProductionDelegate wuhanproduce = new ProductionDelegate(wuhanfactory.ProduceDuckNeck);
//武汉工厂既可以生产鸭脖又可以生产鸭翅
wuhanproduce += wuhanfactory.ProduceDuckWing;
ProductionDelegate nanjingproduce = new ProductionDelegate(nanjingfactory.ProduceDuckWing);
ProductionDelegate changshaproduce = new ProductionDelegate(changshafactory.ProduceDuckNeck);
//调用委托
Console.WriteLine("————武汉工厂————:");
wuhanproduce();
Console.WriteLine("————南京工厂————:");
nanjingproduce();
Console.WriteLine("————长沙工厂————:");
changshaproduce();
Console.ReadLine();
}
}
七、总结
1.完整代码实现
using System;
// 定义生产工厂接口
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()
{
Console.WriteLine("南京工厂无法生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工厂生产鸭翅");
}
}
// 长沙工厂:只能生产鸭脖
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("长沙工厂无法生产鸭翅");
}
}
// 定义生产委托
public delegate void ProductionDelegate();
class Program
{
static void Main(string[] args)
{
// 创建不同工厂的实例
IProductionFactory wuhanfactory = new WuhanFactory();
IProductionFactory nanjingfactory = new NanjingFactory();
IProductionFactory changshafactory = new ChangshaFactory();
// 定义并绑定生产委托
//1.相应任务:鸭脖委托/鸭翅委托
ProductionDelegate duckneckproduce = new ProductionDelegate(wuhanfactory.ProduceDuckNeck);
duckneckproduce += changshafactory.ProduceDuckNeck;
ProductionDelegate duckwingproduce = new ProductionDelegate(wuhanfactory.ProduceDuckWing);
duckwingproduce += nanjingfactory.ProduceDuckWing;
//调用委托
Console.WriteLine("——————能生产鸭脖的工厂——————");
duckneckproduce();
Console.WriteLine("——————能生产鸭翅的工厂——————");
duckwingproduce();
//2.相应工厂:武汉工厂委托/南京工厂委托/长沙工厂委托
ProductionDelegate wuhanproduce = new ProductionDelegate(wuhanfactory.ProduceDuckNeck);
//武汉工厂既可以生产鸭脖又可以生产鸭翅
wuhanproduce += wuhanfactory.ProduceDuckWing;
ProductionDelegate nanjingproduce = new ProductionDelegate(nanjingfactory.ProduceDuckWing);
ProductionDelegate changshaproduce = new ProductionDelegate(changshafactory.ProduceDuckNeck);
//调用委托
Console.WriteLine("————武汉工厂————:");
wuhanproduce();
Console.WriteLine("————南京工厂————:");
nanjingproduce();
Console.WriteLine("————长沙工厂————:");
changshaproduce();
Console.ReadLine();
}
}
2.代码测试
3.心得体会
在这个题目中,委托的使用使得代码更加灵活和可扩展。我们可以通过定义不同的委托来绑定不同工厂的生产方法,从而实现统一的调用方式。这种方式使得我们可以轻松地添加新的工厂或生产方法,而不需要修改现有的代码。委托能让代码结构更加清晰,每个委托都对应一个特定的生产任务,使代码更易于理解和维护。