C#编程 用接口和委托实现不同工厂进行不同生产

一 . 概述

  1. 设计背景:在品牌工厂的运营中,不同地域的工厂往往会根据各自的生产能力和资源分配执行特定的生产任务。因此,建立一套统一的产品生产管理系统对于确保生产效率和产品质量至关重要。

  2. 简介:本博客以周黑鸭工厂为例,详细介绍了如何通过代码实现对其产品的统一管理。该系统主要涵盖了鸭脖和鸭翅两种产品的生产流程。具体而言,武汉工厂具备生产鸭脖和鸭翅的能力,南京工厂专注于鸭翅的生产,而长沙工厂则专注于鸭脖的生产。通过合理的工厂划分和任务分配,能够确保各工厂资源得到最大化利用,提高整体生产效率。

  3. 本博客代码采用C#编写,通过运用面向对象编程的思想,充分利用了类、接口和委托等知识点,实现了对周黑鸭工厂生产流程的精确控制。
  4. 要求:

    1.定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。

    2.定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。

    3.使用委托 ProductionDelegate 定义生产委托。

    4.在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。

  5. 通过本博客的介绍和代码实现,读者将能够深入了解如何使用C#编程语言以及面向对象编程的思想,实现对工厂生产流程的有效管理和控制

二 .接口

定义一个接口,包含两个方法

    public interface IProductionFactory//定义接口
    {
        void ProduceDuckB();//定义生产鸭脖的方法
        void ProduceDuckC();//定义生产鸭翅的方法
    }

三 . 委托

定义一个委托

public delegate void ProductionDelegate();//定义进行生产的委托

四 .工厂类

接口里面有两个方法,继承接口的类中,必须要有接口中的两个方法对应的处理,我们有两个工厂只执行一个生产,那么解决方式是:将不能进行的那个方法抛出异常或置空或写无关语句进行说明。

class WuhanFactory: Factory, IProductionFactory//武汉工厂实现两个生产
{
    public void ProduceDuckB()
    {
        Console.WriteLine("武汉工厂生产鸭脖");
    }
    public void ProduceDuckC()
    {
        Console.WriteLine("武汉工厂生产鸭翅");
    }
}
class NanjingFactory : Factory, IProductionFactory//继承该接口就必须实现其中的两个方法,
                                                  //但我们只需要一个,所以显式实现,
                                                  //将不需要实现的方法进行空实现或抛出异常
{
    public void ProduceDuckB()
    {
        //throw new NotImplementedException();//常规方法
        Console.WriteLine("南京工厂不生产鸭脖");//进阶方法里面产生了接口的实例,
                                                //调用了传过来实例两个接口方法,只实现一个功能的实例调用另一个方法,不能进行像上面的异常处理
                                                //所以写为空或者不执行语句。
    }

    public void ProduceDuckC()
    {
        Console.WriteLine("南京工厂生产鸭翅");
    }
}
class ChangshaFactory : Factory, IProductionFactory//同理
{
    public void ProduceDuckB()
    {
        Console.WriteLine("长沙工厂生产鸭脖");
    }

    public void ProduceDuckC()
    {
        //throw new NotImplementedException();
        Console.WriteLine("长沙工厂不生产鸭翅");//进阶
    }
}

五 .主函数

    本设计,主函数有两个方案进行。

     1.常规:在Main函数中建立一个委托,创建三个工厂实例,将工厂实例调用具体的生产函数添加到委托中,再执行生产委托,常规方法是已知工厂的工作情况,直接将可以进行的添加到委托,也可以将不可以执行的方法添加进委托(pd+=njfactor.ProduceDuckB,这样会进行常规方法里面的异常抛出。

    static void Main(string[] args)//在主函数中创建各工厂实例,然后用委托来执行生产
    {
        Work work = new Work();
        ProductionDelegate pd;//建立生产委托
        WuhanFactory whfactor = new WuhanFactory();
        NanjingFactory njfactor = new NanjingFactory();
        ChangshaFactory csfactor = new ChangshaFactory();
        pd = null;//先清空生产委托,再进行添加生产
        pd += whfactor.ProduceDuckB;//常规方法
        pd += whfactor.ProduceDuckC;
        pd += njfactor.ProduceDuckC;
        pd += csfactor.ProduceDuckB;
        pd();//执行该委托

        /*pd+=work.ProduceFunc(whfactor);//进阶方法  调用这个进阶方法函数,必须要有整体类Work的实例,才能来调用
        pd+=work.ProduceFunc(njfactor);
        pd+=work.ProduceFunc(csfactor);
        pd();*/
    }

      2.进阶 :进阶方法,构建一个函数,函数参数为接口类型,接受具体的实例,在函数中建立实例的委托,将两个函数给到建立的委托(只实现一个生产功能的,另一个生产函数为空显示或无用显示),返回类型为委托类型,三个实例返回三个对应的委托,在主函数中加入到主委托中,再进行执行。进阶方法节省了代码量(避免手动添加实例的各种方法),并且方便以后有更多工厂来进行生产,主要对于添加的不生产的方法添加然后进行解决。

    public ProductionDelegate ProduceFunc(IProductionFactory factory)/*进阶方法,使用函数,参数为接口类型,返回委托类型,
                                                                      * 将实例传入进来,再加入到一个委托里面,每一个实例对应一个委托,
                                                                      * 再在主函数里面将三个委托合起来*/
    {
        ProductionDelegate p_d;
        p_d = null;
        p_d += factory.ProduceDuckB;
        p_d += factory.ProduceDuckC;
        return p_d;
    }
    static void Main(string[] args)//在主函数中创建各工厂实例,然后用委托来执行生产
    {
        Work work = new Work();
        ProductionDelegate pd;//建立生产委托
        WuhanFactory whfactor = new WuhanFactory();
        NanjingFactory njfactor = new NanjingFactory();
        ChangshaFactory csfactor = new ChangshaFactory();
        pd = null;//先清空生产委托,再进行添加生产
        /*pd += whfactor.ProduceDuckB;//常规方法
        pd += whfactor.ProduceDuckC;
        pd += njfactor.ProduceDuckC;
        pd += csfactor.ProduceDuckB;
        pd();//执行该委托*/

        pd+=work.ProduceFunc(whfactor);//进阶方法  调用这个进阶方法函数,必须要有整体类Work的实例,才能来调用
        pd+=work.ProduceFunc(njfactor);
        pd+=work.ProduceFunc(csfactor);
        pd();
    }

六 .执行结果

1.常规:

2.进阶:

七 .完整代码

含有注释的完整代码如下:

using System;
class Work
{
    class Factory//三个工厂的父类继承,但不包含我们的主要功能:生产
    {
        //包含工厂的基本属性,目前没要求实现,为空不写
    }
    public interface IProductionFactory//定义接口
    {
        void ProduceDuckB();//定义生产鸭脖的方法
        void ProduceDuckC();//定义生产鸭翅的方法
    }
    public delegate void ProductionDelegate();//定义进行生产的委托
    class WuhanFactory: Factory, IProductionFactory//武汉工厂实现两个生产
    {
        public void ProduceDuckB()
        {
            Console.WriteLine("武汉工厂生产鸭脖");
        }
        public void ProduceDuckC()
        {
            Console.WriteLine("武汉工厂生产鸭翅");
        }
    }
    class NanjingFactory : Factory, IProductionFactory//继承该接口就必须实现其中的两个方法,
                                                      //但我们只需要一个,所以显式实现,
                                                      //将不需要实现的方法进行空实现或抛出异常
    {
        public void ProduceDuckB()
        {
            //throw new NotImplementedException();//常规方法
            Console.WriteLine("南京工厂不生产鸭脖");//进阶方法里面产生了接口的实例,
                                                    //调用了传过来实例两个接口方法,只实现一个功能的实例调用另一个方法,不能进行像上面的异常处理
                                                    //所以写为空或者不执行语句。
        }

        public void ProduceDuckC()
        {
            Console.WriteLine("南京工厂生产鸭翅");
        }
    }
    class ChangshaFactory : Factory, IProductionFactory//同理
    {
        public void ProduceDuckB()
        {
            Console.WriteLine("长沙工厂生产鸭脖");
        }

        public void ProduceDuckC()
        {
            //throw new NotImplementedException();
            Console.WriteLine("长沙工厂不生产鸭翅");//进阶
        }
    }

    public ProductionDelegate ProduceFunc(IProductionFactory factory)/*进阶方法,使用函数,参数为接口类型,返回委托类型,
                                                                      * 将实例传入进来,再加入到一个委托里面,每一个实例对应一个委托,
                                                                      * 再在主函数里面将三个委托合起来*/
    {
        ProductionDelegate p_d;
        p_d = null;
        p_d += factory.ProduceDuckB;
        p_d += factory.ProduceDuckC;
        return p_d;
    }
    static void Main(string[] args)//在主函数中创建各工厂实例,然后用委托来执行生产
    {
        Work work = new Work();
        ProductionDelegate pd;//建立生产委托
        WuhanFactory whfactor = new WuhanFactory();
        NanjingFactory njfactor = new NanjingFactory();
        ChangshaFactory csfactor = new ChangshaFactory();
        pd = null;//先清空生产委托,再进行添加生产
        /*pd += whfactor.ProduceDuckB;//常规方法
        pd += whfactor.ProduceDuckC;
        pd += njfactor.ProduceDuckC;
        pd += csfactor.ProduceDuckB;
        pd();//执行该委托*/

        pd+=work.ProduceFunc(whfactor);//进阶方法  调用这个进阶方法函数,必须要有整体类Work的实例,才能来调用
        pd+=work.ProduceFunc(njfactor);
        pd+=work.ProduceFunc(csfactor);
        pd();
    }

}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值