工厂模式

一、简单工厂与工厂模式的区别 

1.1 简单工厂模式

     专门定义一个工厂类负责创建其他类的实例,最大的优点在于工厂类中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类

1.2 工厂方法模式

     创建对象的接口,让子类去决定具体实例化的对象,把简单的内部逻辑判断移到了客户端代码。工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点

二、简单工厂UML图

 

三、代码实现

  3.1 工厂模式

class Program  
    {  
        static void Main(string[] args)  
        {  
            IFactory factory = new UndergraduateFactory();   //由接口创建新的学雷锋大学生  
            LeiFeng student = factory.CreateLeifeng();   //实例化  
  
            student.BuyRice();  
            student.Sweep();  
            student.Wash();  
        }  
    }  
    //雷锋类,定义了一些功能  
    class LeiFeng    
    {  
        public void Sweep(){ } //擦桌子  
        public void Wash(){ }  //洗衣服  
        public void BuyRice(){ }  //买米  
    }  
  
  
    //学雷锋的大学生  
    class UnderGraduate : LeiFeng{ }  
    //社区志愿者  
    class Volunteer : LeiFeng{ }  
  
    //雷锋工厂  
    interface IFactory //定义一个接口,实现创建雷锋类的功能  
    {  
        LeiFeng CreateLeifeng();  
    }  
      
    class UndergraduateFactory : IFactory//学雷锋大学生工厂  
    {  
        public LeiFeng CreateLeiFeng()  
        {  
            return new UnderGraduate();  
        }  
    }  
    class VolunteerFactory : IFactory//社区志愿者工厂  
    {  
        public LeiFeng CreateLeiFeng()  
        {  
            return new Volunteer();  
        }  
    }

  3.2 简单工厂实现

class Program  
    {  
        static void Main(string[] args)  
        {  
            LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生");//用简单工厂创建并实例化学雷锋的大学生  
            studentA.BuyRice();  
            LeiFeng studentB = SimpleFactory.CreateLeiFeng("社区志愿者");//用简单工厂创建实例化社区志愿者  
            studentB.BuyRice();  
        }  
    }  
    //雷锋类,定义了一些功能  
    class LeiFeng    
    {  
        public void Sweep(){ } //擦桌子  
        public void Wash(){ }  //洗衣服  
        public void BuyRice(){ }  //买米  
    }  
  
  
    //简单工厂类  
    class SimpleFactory  
    {  
       public static LeiFeng CreateLeiFeng(string type)  
       {  
            LeiFeng result = null;  
            switch (type) //判断选择要创建对象的类型  
            {   
                case "学雷锋的大学生":  
                    result = new UnderGraduate();  
                    break;  
                case "社区志愿者":  
                   result = new UnderGraduate();  
                   break;  
            }  
            return result;  
        }  
  
    }

 

 

posted @ 2016-05-07 20:10  Leo的日记本  阅读(179)  评论(0编辑  收藏  举报