码迷,mamicode.com
首页 > 其他好文 > 详细

简单工厂模式、工厂模式、抽象工厂模式

时间:2017-09-30 17:41:45      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:cto   ima   hid   缺陷   gif   分离   判断   nbsp   避免   

1.简单工厂模式:调用类只需要向工厂类请求方法,由工厂决定创建出哪个类的实例,而不需要关心被调用类的实现过程。

优势:调用类 和 被调用类分离,调用类需要时只需要向工厂请求,避免了调用类和被调用类之间的硬耦合。

缺陷:被调用类更改 工厂类也需要同步更改。

实例:

技术分享
 public interface IAnimal
    {
        void Eat();
    }
    public class Cat : IAnimal
    {
        public void Eat()
        {
            Console.WriteLine("我是小猫咪,当然吃鱼了..");
        }
    }
    public class Dog : IAnimal
    {
        public void Eat()
        {
            Console.WriteLine("我是小狗狗,记得给我带骨头来啊..");
        }
    }

    public class AnimalFactory
    {
        public IAnimal GetAnimal(string animalType)
        {
            if (animalType=="cat")
            {
                return new Cat();
            }
            if (animalType=="dog")
            {
                return new Dog();
            }
            return null;
        }
    }

  class Program
    {
        static void Main(string[] args)
        {
            IAnimal animal;
            animal = new AnimalFactory().GetAnimal("cat");
            animal.Eat();
            Console.WriteLine("----------------");

            animal = new AnimalFactory().GetAnimal("dog");
            animal.Eat();
            Console.ReadLine();
        }
    }
View Code

 

2.工厂模式:如果我们不想在工厂类中加判断,可以为不同的类提供不同的工厂,不同的工厂生产不同的产品。

缺陷:调用类和工厂类之间存在硬编码耦合。

实例:

技术分享
  public interface IAnimal
    {
        void Eat();
    }
    public class Cat : IAnimal
    {
        public void Eat()
        {
            Console.WriteLine("我是小猫咪,当然吃鱼了..");
        }
    }
    public class Dog : IAnimal
    {
        public void Eat()
        {
            Console.WriteLine("我是小狗狗,记得给我带骨头来啊..");
        }
    }

    public class CatFactory
    {
        public IAnimal GetAnimal()
        {
            
                return new Cat();
         }
    }

    public class DogFactory
    {
        public IAnimal GetAnimal()
        {

            return new Dog();
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            IAnimal animal;
            animal = new CatFactory().GetAnimal();
            animal.Eat();
            Console.WriteLine("----------------");

            animal = new DogFactory().GetAnimal();
            animal.Eat();
            Console.ReadLine();
        }
    }
View Code

 

3.抽象工厂: 使用简单工厂模式,需要在工厂类增加逻辑判断,而使用工厂模式,又造成了调用类和工厂类的硬编码耦合,所以我们可以在新建一个类,这个类不制造具体的被调用对象,而是只制造工厂对象。

实例:

技术分享
  public interface IAnimal
    {
        void Eat();
    }
    public class Cat : IAnimal
    {
        public void Eat()
        {
            Console.WriteLine("我是小猫咪,当然吃鱼了..");
        }
    }
    public class Dog : IAnimal
    {
        public void Eat()
        {
            Console.WriteLine("我是小狗狗,记得给我带骨头来啊..");
        }
    }


    public  interface IFactory{
        IAnimal GetAnimal();
    }

    public class CatFactory:IFactory
    {
        public IAnimal GetAnimal()
        {
            
                return new Cat();
         }
    }

    public class DogFactory : IFactory
    {
        public IAnimal GetAnimal()
        {

            return new Dog();
        }
    }


    public class AbstractFactory
    {
        public IFactory GetFactory(string factoryname)
        {
            if (factoryname == "cat")
            {
                return new CatFactory();
            }
            if (factoryname == "dog")
            {
                return new DogFactory();
            }
            return null;
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            IFactory factory;
            factory = new AbstractFactory().GetFactory("cat");
            factory.GetAnimal().Eat();
            Console.WriteLine("----------------");

            factory = new AbstractFactory().GetFactory("dog");
            factory.GetAnimal().Eat();
            Console.ReadLine();
        }
    }
View Code

 

简单工厂模式、工厂模式、抽象工厂模式

标签:cto   ima   hid   缺陷   gif   分离   判断   nbsp   避免   

原文地址:http://www.cnblogs.com/mili3/p/7615256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!