【工厂方法模式】雷锋在人间

举报
Laura_张 发表于 2022/08/26 23:45:30 2022/08/26
【摘要】 文章目录 简单工厂模式结构图: 工厂方法模式工厂方法模式:结构图加减乘除的类图:雷锋工厂 对比两个模式 简单工厂模式 一个简单地加减乘除类 结构图...


简单工厂模式

一个简单地加减乘除类

结构图:

在这里插入图片描述
只要输入运算符号,工厂就可以实例化出一个合适的对象,通过多态,返回父类的方式实现了计算器的结果。
如果需要更改加法运算,直接更改OperationAdd就可以。
如果增加其他运算,只要增加相应的运算子类就可以了。
如果需要修改运算类工厂,只需要在switch中增加分支。

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式

工厂方法模式:

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

结构图

在这里插入图片描述
对于上面的加减乘除的工厂方法

工厂类与分支耦合,根据依赖倒转原则,把工厂抽象出一个接口,这个接口只有一个方法,那就是创建抽象产品的工厂方法,然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,就变成了一个工厂抽象接口和多个具体生成对象的工厂,这样在增加“求M数的N次方”的功能时,不需要更改原有的工厂类,只需要增加此功能的运算类和相应的工厂类就可以了。这样比较符合开闭原则

加减乘除的类图:

在这里插入图片描述
存在的问题:
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的,现在是修改客户端的。

雷锋工厂

帮助孤寡老人的类叫雷锋类,雷锋需要做的是扫地 洗衣 买米等活动。雷锋可以是大学生也可以是社区志愿者,但是老人只知道“雷锋”,所以这里就让大学生和社区志愿者继承雷锋类,来帮助孤寡老人。

雷锋类

namespace 雷锋工厂
{
    //雷锋
    /// <summary>
    /// 雷锋类拥有的方法
    /// </summary>
    class LeiFeng
    {
        public void Sweep()
        {
            Console.WriteLine("扫地");
        }
        public void Wash()
        {
            Console.WriteLine("洗衣");
        }
        public void BuyRice()
        {
            Console.WriteLine("买米");
        }
    }
}

雷锋工厂的接口;

    //定义一个雷锋工厂的接口
    //雷锋工厂
    interface IFactory
    {
        LeiFeng CreateLeiFeng();
    }

学雷锋的大学生工厂

   //学雷锋的大学生工厂
    /// <summary>
    /// 继承雷锋工厂的方法
    /// </summary>
    class UndergraduateFactory:IFactory
    {
        public LeiFeng CreateLeiFeng ()
        {
            return new Undergraduate();
        }
    }

社区志愿者工厂:

    //社区志愿者工厂
    class VolunteerFactory:IFactory
    {
        public LeiFeng  CreateLeiFeng()
        {
            return new Volunteer();
        }
    }

客户端代码:

namespace 雷锋工厂
{
    class Program
    {
        //工厂方法模式,直接调用就可以
        static void Main(string[] args)
        {
            //这里是大学生工厂
            IFactory factory = new UndergraduateFactory();
            LeiFeng student = factory.CreateLeiFeng();

            student.BuyRice();
            student.Sweep();
            student.Wash();
            
            //这里是社区志愿者
            IFactory factory = new VolunteerFactory();
            LeiFeng Volunteer = factory.CreateLeiFeng();

            Volunteer.BuyRice();
            Volunteer.Sweep();
            Volunteer.Wash();
            	
            Console.ReadKey();
        }
    }
}

对比两个模式

工厂方法克服了简单工厂违背开闭原则的缺点,保持了封装对象创建过程的优点。他们都是集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可以实现,降低了客户程序与产品对象的耦合。

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,并且克服了他的优点,但是缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。而且这里还是修改了客户端的代码。

文章来源: blog.csdn.net,作者:张艳伟_Laura,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Laura__zhang/article/details/113765845

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。