一、引言
在软件开发中,工厂模式是一种常用的设计模式,它提供了一种在不指定具体类的情况下创建对象的机制。本文将使用C#编程语言,结合接口、类和委托等关键知识点,实现对周黑鸭工厂产品生产的统一管理。
二、设计思路
首先,我们需要定义一个接口 IProductionFactory
,该接口将包含生产鸭脖和鸭翅的方法。接着,我们将创建三个类 WuhanFactory
、NanjingFactory
和 ChangshaFactory
,分别实现 IProductionFactory
接口,以表示不同的生产工厂。这些工厂类将实现具体的生产逻辑。
为了实现对不同工厂生产的统一管理,我们将使用委托 ProductionDelegate
。委托是一种特殊的类型,它安全地封装了方法的签名和定义,可以作为参数进行传递。我们将利用委托来调用不同工厂的生产方法。
三、代码实现
实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
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()
{
throw new NotImplementedException("南京工厂不能生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工厂生产鸭翅");
}
}
// 长沙工厂类,只能生产鸭脖
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产鸭脖");
}
public void ProduceDuckWing()
{
throw new NotImplementedException("长沙工厂不能生产鸭翅");
}
}
// 定义生产委托
public delegate void ProductionDelegate(IProductionFactory factory);
class Program
{
static void Main(string[] args)
{
// 创建工厂实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 定义生产委托并绑定到工厂的生产方法上
ProductionDelegate produceDuckNeckDelegate = new ProductionDelegate(ProduceDuckNeck);
ProductionDelegate produceDuckWingDelegate = new ProductionDelegate(ProduceDuckWing);
// 通过委托进行生产
Console.WriteLine("武汉工厂生产:");
produceDuckNeckDelegate(wuhanFactory);
produceDuckWingDelegate(wuhanFactory);
Console.WriteLine("\n南京工厂生产:");
try
{
produceDuckNeckDelegate(nanjingFactory); // 这会抛出异常
}
catch (NotImplementedException ex)
{
Console.WriteLine(ex.Message);
}
produceDuckWingDelegate(nanjingFactory);
Console.WriteLine("\n长沙工厂生产:");
produceDuckNeckDelegate(changshaFactory);
try
{
produceDuckWingDelegate(changshaFactory); // 这会抛出异常
}
catch (NotImplementedException ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("\n按任意键退出...");
Console.ReadKey();
}
// 辅助方法,用于通过委托调用工厂的生产方法
static void ProduceDuckNeck(IProductionFactory factory)
{
factory.ProduceDuckNeck();
}
static void ProduceDuckWing(IProductionFactory factory)
{
factory.ProduceDuckWing();
}
}
1、接口
接口(Interface)是一种引用类型,它是方法的集合。接口定义了一个类应遵循的契约。与类不同,接口不包含字段、属性、事件或方法的实现。它只是定义了一个结构,该结构由其他类实现。
接口的语法结构:
[访问修饰符] interface 接口标识符 [:基接口列表]
{
接口成员声明;
}
// 定义生产工厂接口
public interface IProductionFactory
{
void ProduceDuckNeck();
void ProduceDuckWing();
}
该接口定义了两个方法:ProduceDuckNeck
和 ProduceDuckWing
,分别用于生产鸭脖和鸭翅。
几点需要注意:
- 接口不能包含字段(field),但可以包含属性(property)、事件(event)和方法(method)。
- 接口的方法不能有实现(即没有方法体)。
- 接口可以继承自其他接口,但不能继承自类。
- 类可以实现一个或多个接口。当类实现接口时,它必须提供接口中定义的所有方法的实现。
2、实现工厂类/接口实现
类实现接口的语法是使用“:”后跟接口名称列表,在类定义中指定。然后,该类必须提供接口中所有成员的实现。
// 武汉工厂类,能生产鸭脖和鸭翅
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("武汉工厂生产鸭翅");
}
}
// 南京工厂类,只能生产鸭翅
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
throw new NotImplementedException("南京工厂不能生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工厂生产鸭翅");
}
}
// 长沙工厂类,只能生产鸭脖
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产鸭脖");
}
public void ProduceDuckWing()
{
throw new NotImplementedException("长沙工厂不能生产鸭翅");
}
}
每个工厂类都实现了 IProductionFactory
接口,并根据实际需求实现了生产方法。对于不能生产的产品,我们抛出了 NotSupportedException
异常。
当类实现接口时,它必须保证以下几点:
- 实现接口中声明的所有方法。
- 实现接口中声明的所有属性(包括它们的
get
和set
访问器)。 - 实现接口中声明的所有事件。
一旦类实现了接口,就可以创建该类的实例,并通过该实例访问接口中定义的成员。这允许你编写使用接口的通用代码,而不必关心具体的实现类。这是面向接口编程的一个主要优点,它提高了代码的灵活性和可维护性。
3. 定义生产委托
委托(Delegate)是一种特殊的类型,它定义了方法的签名和返回类型,可以将方法作为参数传递或赋值给变量。委托主要用于实现回调函数和事件驱动程序设计。
public delegate void ProductionDelegate(IProductionFactory factory);
public delegate
:表示这是一个公共的委托类型。void
:委托所引用方法的返回类型。ProductionDelegate
:委托的名称,遵循C#的命名规则。IProductionFactory factory
:委托所引用方法的参数类型列表。
定义了一个名为 ProductionDelegate
的委托,它接受一个 IProductionFactory
类型的参数。
4. Main 函数中的使用
class Program
{
static void Main(string[] args)
{
// 创建工厂实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 定义生产委托并绑定到工厂的生产方法上
ProductionDelegate produceDuckNeckDelegate = new ProductionDelegate(ProduceDuckNeck);
ProductionDelegate produceDuckWingDelegate = new ProductionDelegate(ProduceDuckWing);
// 通过委托进行生产
Console.WriteLine("武汉工厂生产:");
produceDuckNeckDelegate(wuhanFactory);
produceDuckWingDelegate(wuhanFactory);
Console.WriteLine("\n南京工厂生产:");
try
{
produceDuckNeckDelegate(nanjingFactory); // 这会抛出异常
}
catch (NotImplementedException ex)
{
Console.WriteLine(ex.Message);
}
produceDuckWingDelegate(nanjingFactory);
Console.WriteLine("\n长沙工厂生产:");
produceDuckNeckDelegate(changshaFactory);
try
{
produceDuckWingDelegate(changshaFactory); // 这会抛出异常
}
catch (NotImplementedException ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("\n按任意键退出...");
Console.ReadKey();
}
// 辅助方法,用于通过委托调用工厂的生产方法
static void ProduceDuckNeck(IProductionFactory factory)
{
factory.ProduceDuckNeck();
}
static void ProduceDuckWing(IProductionFactory factory)
{
factory.ProduceDuckWing();
}
}
在 Main
函数中,我们创建了三个工厂实例,并创建了一个 ProductionDelegate
类型的委托实例 produceDelegate
,将其绑定到 Produce
辅助方法上。通过该委托,我们可以调用不同工厂的生产方法。
四、难点解析
在实现过程中,一个难点在于如何处理不同工厂不能生产的产品。我们使用了异常机制来应对这种情况,当工厂不能生产某个产品时,抛出 NotSupportedException
异常。在实际应用中,我们可能还需要考虑更加优雅的错误处理方式,比如返回特定的错误码或使用其他错误处理模式。
另外,委托的使用使得我们可以更加灵活地调用不同工厂的生产方法。通过将委托作为参数传递,我们可以轻松地在不修改代码结构的情况下,添加新的工厂或改变生产逻辑。
五、运行结果
六、总结
在这个案例中,我们通过c#设计了一套系统来实现对周黑鸭工厂产品生产的统一管理,其中涉及到定义接口、实现具体工厂类、使用委托以及各方法的协同工作。通过这种方式,系统的各个部分既保持了足够的灵活性和扩展性,又能够在统一的框架下高效协作,达成我们想要实现的目标。