【设计模式】——工厂方法模式

 

 

 

 

 

【工厂模式】

 

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

 

【介绍】

  • 主要解决:接口选择的问题

  • 何时使用:明确的计划不同条件下创建不同实例时

  • 如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品

  • 关键代码:创建过程在其子类执行

  • 优点:一个调用者想创建一个对象,只要知道名称就行;扩展性高:如果想增加一个产品,只要扩展一个工厂类就可以了;屏蔽产品的具体实现,调用者只关心产品的接口

  • 缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍的增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖

  • 注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,简单对象只需要通过new就可以完成创建的对象,无需使用工厂模式。

 

【实现】

【设计模式】——工厂方法模式

 

步骤一:雷锋类

class LeiFeng

    {

        public void Sweep()

        {

            Console.WriteLine("扫地");

        }



        public void Wash()

        {

            Console.WriteLine("洗衣");

        }



        public void BuyRice()

        {

            Console.WriteLine("买米");

        }

    }

 

步骤二:创建实现接口的实体类

 

//学雷锋的大学生

    class Undergraduate : LeiFeng

    { }



    //社区志愿者

    class Volunteer : LeiFeng

    { }

 

步骤三:工厂类

//简单雷锋工厂

    class SimpleFactory

    {

        public static LeiFeng CreateLeiFeng(string type)

        {

            LeiFeng result = null;

            switch (type)

            {

                case "学雷锋的大学生":

                    result = new Undergraduate();

                    break;

                case "社区志愿者":

                    result = new Volunteer();

                    break;



            }

            return result;

        }

    }



    //雷锋工厂

    interface IFactory

    {

        LeiFeng CreateLeiFeng();

    }



    //学雷锋的大学生工厂

    class UndergraduateFactory : IFactory

    {

        public LeiFeng CreateLeiFeng()

        {

            return new Undergraduate();

        }

    }



    //社区志愿者工厂

    class VolunteerFactory : IFactory

    {

        public LeiFeng CreateLeiFeng()

        {

            return new Volunteer();

        }

    }

 

步骤四:客户端代码


 

static void Main(string[] args)

        {



           

     

            LeiFeng xueleifeng = new Undergraduate();



            xueleifeng.BuyRice();

            xueleifeng.Sweep();

            xueleifeng.Wash();





            LeiFeng student1 = new Undergraduate();

            student1.BuyRice();

            LeiFeng student2 = new Undergraduate();

            student2.Sweep();

            LeiFeng student3 = new Undergraduate();

            student3.Wash();







            //简单工厂模式

            LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生");

            studentA.BuyRice();

            LeiFeng studentB = SimpleFactory.CreateLeiFeng("学雷锋的大学生");

            studentB.Sweep();

            LeiFeng studentC = SimpleFactory.CreateLeiFeng("学雷锋的大学生");

            studentC.Wash();





            //工厂方法模式

            IFactory factory = new UndergraduateFactory();

            LeiFeng student = factory.CreateLeiFeng();



            student.BuyRice();

            student.Sweep();

            student.Wash();



            Console.Read();

        }

 

【总结】

一、三者之间的区分

简单工厂:一个工厂类,一个产品抽象类。

 工厂方法:多个工厂类,一个产品抽象类。

 抽象工厂:多个工厂类,多个产品抽象类。

二、生活中的工厂模式

 简单工厂类:一个麦当劳店,可以生产多种汉堡。

 工厂方法类:一个麦当劳店,可以生产多种汉堡。一个肯德基店,也可以生产多种汉堡。

 抽象工厂类:百胜餐饮集团下有肯德基和百事公司,肯德基生产汉堡,百事公司生成百事可乐。