目录
前言
本文通过使用 C# 编码,实现了对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。其中,武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。
一、定义接口
1、代码实现
通过定义接口IproductionFactory,约束和定义所有工厂类必须实现的方法,其中包括生产鸭脖(ProduceDuckNeck
)和生产鸭翅(ProduceDuckWing
)。
代码如下:
using System;
public interface IProductionFactory
{
// 生产鸭脖的方法
void ProduceDuckNeck();
// 生产鸭翅的方法
void ProduceDuckWing();
}
2、接口的作用
1、定义契约
IProductionFactory
接口定义了两个方法:ProduceDuckNeck
和 ProduceDuckWing
。任何实 现 IProductionFactory
的类,都必须提供这两个方法的具体实现。
2、保持代码的一致性
所有实现了 IProductionFactory
接口的类,都会有同样的方法名称、参数列表和返回类型。从而保证了无论使用哪个工厂类,我们都可以以相同的方式使用它们。
3、实现多态
通过接口,我们可以实现多态性。在本例中,WuhanFactory、NanjingFactory 和 ChangshaFactory(接下来会提到) 分别实现了通过相同的接口提供不同的实现,这意味着我们可以通过接口类型的引用调用具体实例的方法,而不需要知道其中具体实现的细节。
4、提高代码的可拓展性和可维护性
当我们想要添加新的工厂类或者改变生产方式时,只用确保新的类实现了 IProductionFactory
接口。而主程序仍然可以使用同样的方式来调用新工厂的方法,有助于代码的可扩展性和可维护性。
二、实现接口的具体工厂类
1、代码实现
接下来,我们分别为武汉、南京和长沙工厂创建具体类,这些类通过实现前面定义的IProductionFactory
接口,提供了生产鸭脖和鸭翅的具体操作实现。其中,武汉工厂既生产鸭脖又生产鸭翅,南京工厂不生产鸭脖,长沙工厂不生产鸭翅。
代码如下:
//武汉工厂既生产鸭脖又生产鸭翅
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("长沙工厂不生产鸭翅");
}
}
2、意义
通过接口IProductionFactory
,我们可以用同一接口引用来指向不同的实现类的实例(new WuhanFactory()
、new NanjingFactory()
、new ChangshaFactory(),在下文中会提到
),而在调用ProduceDuckNeck()
和ProduceDuckWing()
方法时,执行的却是各自类的具体实现,充分体现了多态性。
3、实现接口时的注意事项
1、完整实现接口中的所有方法
必须提供所有在接口中声明的方法的具体实现。
2、接口中的方法不能带有访问修饰符
接口中的方法默认是 public
的,不能有任何访问修饰符(如 private
)。实现这些方法时,必须显式地使用 public
访问修饰符,来标明这些方法对外是可见的。
3、接口方法必须匹配
实现接口中的方法时,必须保证返回类型、方法名、参数类型和参数顺序完全匹配。
4、自行提供成员变量
接口只能包含方法的声明,故实现接口的类需要自行提供所需的数据成员。
5、显示实现接口成员
当一个类同时实现多个接口,并且这些接口中有相同的方法签名时,可以用接口的显式实现来区分这些方法。显式实现接口成员是指在方法名前加上接口名称(如 void IProductionFactory.ProduceDuckNeck()
),这样该方法将仅在通过接口的引用类型调用时可用。
三、定义生产委托
1、代码实现
定义委托ProductionDelegate
来引用并执行工厂的生产方法。
代码如下:
public delegate void ProductionDelegate();
2、意义
通过ProductionDelegate
委托来引用各个工厂的生产方法(如ProduceDuckNeck
和ProduceDuckWing
),使得我们可以在运行时决定具体调用哪个工厂的哪个生产方法。
3、使用委托时的注意事项
1、必须匹配
被委托引用的方法必须与委托的方法返回类型和参数列表完全匹配。
2、委托链的管理
在委托中,我们可以使用+=
来添加多个方法,形成委托链。但需要注意的是,当委托链中的一个方法抛出异常时,后续的方法将不会执行。因此,我们在设计时要考虑异常的捕获和处理。
四、使用委托实现生产管理
1、代码实现
在主函数(Main
)中,我们创建各个工厂的实例,并通过委托来调用它们的生产方法,以此来实现对生产的统一管理。
代码如下:
class Program
{
static void Main(string[] args)
{
//分别创建武汉、南京和长沙工厂的实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
//为每个工厂实例创建委托实例,并指向相应的生产方法
//武汉工厂同时生产鸭脖和鸭翅
ProductionDelegate wuhanProduction = new ProductionDelegate(wuhanFactory.ProduceDuckNeck);
wuhanProduction += wuhanFactory.ProduceDuckWing;
//南京工厂只生产鸭翅
ProductionDelegate nanjingProduction = new ProductionDelegate(nanjingFactory.ProduceDuckWing);
//长沙工厂只生产鸭脖
ProductionDelegate changshaProduction = new ProductionDelegate(changshaFactory.ProduceDuckNeck);
//调用委托执行生产
//武汉
Console.WriteLine("武汉工厂:");
wuhanProduction();
//南京
Console.WriteLine("\n南京工厂:");
nanjingProduction();
//长沙
Console.WriteLine("\n长沙工厂:");
changshaProduction();
}
}
2、执行结果
总结
在这个案例中,我们通过c#设计了一套系统来实现对周黑鸭工厂产品生产的统一管理,其中涉及到定义接口、实现具体工厂类、使用委托以及各方法的协同工作。通过这种方式,系统的各个部分既保持了足够的灵活性和扩展性,又能够在统一的框架下高效协作,达成我们想要实现的目标。