工厂方法模式

        工厂方法(FactoryMethod)模式:是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。也就是说核心工厂类不再负责产品的创建,仅负责具体工厂子类必须实现的接口就行。这样抽象的好处是显而易见的,我们不再需要去修改具体工厂的角色了。

        例如下面的代码:是一个即将毕业的大学生,以学雷锋做好事的名义去帮助一位老人:

         //雷锋类
        class LeiFeng
        {
            public void Sweep()
            {
                Console.WriteLine("扫地");
            }

            public void Wash()
            {
                Console.WriteLine("洗衣");
            }

            public void BuyRice()
            {
                Console.WriteLine("买米");
            }
        }

        //“学雷锋的大学生”类,继承雷锋
        class UnderGraduate : LeiFeng
        {
        }
        //客户端代码
        static void Main(string[] args)
        {
            LeiFeng xueleifeng = new UnderGraduate();

            xueleifeng.Wash();
            xueleifeng.Sweep();
            xueleifeng.BuyRice();
        }

         现在如果添加人数,例如共3位同学做这些事,那么只需要实例化三个“学雷锋的大学生”对象了:

         //客户端代码

        static void Main(string[] args)

        {

            LeiFeng student1 = newUnderGraduate();

            student1.Wash();

            LeiFeng student2 = newUnderGraduate();

            student2.Sweep();

            LeiFeng studen3 = newUnderGraduate();

            studen3.BuyRice();

        }

         这时候就有人有异议了,难道只能大学生去学雷锋做好事吗?我们中学生也可以尽一己之力的。于是,这时候就不是单单实例化多个对象的问题了。

        于是雷锋工厂就来了。

         //雷锋工厂

        interface Ifactory

        {

            LeiFeng CreateLeiFeng();

        }

 

        //“学雷锋的大学生”工厂

        class UnderGraduateFactory : Ifactory 

        {

            public LeiFeng CreateLeiFeng()

            {

                return new UnderGraduate() ;

            }

        }

 

        //“学雷锋的中学生”工厂

        class  MiddleStudentFactory : Ifactory

        {

            public LeiFeng CreateLeiFeng()

            {

                return new MiddleStudent();

            }

        }

         客户端调用的时候只需要这样就可以了:

         //客户端代码

        static void Main(string[] args)

        {

            //工厂方法模式

            Ifactory factory = newUnderGraduateFactory();   //要换成“中学生”,修改这里就行

            LeiFeng student =factory.CreateLeiFeng();

 

            student.BuyRice();

            student.Wash();

            student.Sweep();

        }

         这时候怎么样,想换成中学生还不容易吗?

        通过以上的代码,我们可以看到,工厂方法克服了简单工厂违背“开放-封闭原则”的缺点,又保持了封装对象创建过程的优点,降低了客户程序与产品对象的耦合。可以说工厂方法模式是简单工厂模式的进一步抽象和推广。

        可是有一个问题,当我们每增加一个产品时,都需要加一个产品工厂的类,很显然会增加额外的开发量,那该怎么办呢?这又要说到-“反射”了。不过此篇博客不会细讲,在以后的抽象工厂模式中会有详解。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值