你的位置:首页 > ASP.net教程

[ASP.net教程]每天一段代码


  如何将实例化具体类的代码从应用中抽离,或者封装起来,使他们不会干扰到应用的其他部分?

  静态工厂方法 

 1   interface IAnimal 2   { 3     void Shout(); 4   } 5  6   class Dog:IAnimal 7   { 8     #region IAnimal 成员 9 10     public void Shout()11     {12       Console.WriteLine("汪汪汪...");13     }14 15     #endregion16   }17 18   class Duck:IAnimal19   {20     #region IAnimal 成员21 22     public void Shout()23     {24       Console.WriteLine("嘎嘎嘎...");25     }26 27     #endregion28   }

 1   class AnimalFactory 2   { 3     //静态工厂方法 4     public static IAnimal Create(string category) 5     { 6       IAnimal animal = null; 7       switch (category) 8       { 9         case "Dog":10           animal = new Dog();11           break;12         case "Duck":13           animal = new Duck();14           break;15         default:16           break;17       }18       return animal;19     }20   }

  把具体实例化的过程封装了起来,这已经开始有了面向对象编程的意识了(虽然这里用的是静态方法)。

  工厂方法模式

  接着上面的例子,我们把动物种类进行抽象,不再让他通同switch判断,下面我们创建动物类的工厂

 1   public interface AnimalFactory 2   { 3     IAnimal Create(); 4   } 5  6   class DogFactory:AnimalFactory 7   { 8     #region AnimalFactory 成员 9 10     public IAnimal Create()11     {12       return new Dog();13     }14 15     #endregion16   }17 18   class DuckFactory:AnimalFactory19   {20     #region AnimalFactory 成员21 22     public IAnimal Create()23     {24       return new Duck();25     }26 27     #endregion28   }

 1  public interface IAnimal 2   { 3     void Shout(); 4   } 5  6   class Duck:IAnimal 7   { 8     #region IAnimal 成员 9 10     public void Shout()11     {12       Console.WriteLine("嘎嘎嘎...");13     }14 15     #endregion16   }17 18   class Dog : IAnimal19   {20     #region IAnimal 成员21 22     public void Shout()23     {24       Console.WriteLine("汪汪汪...");25     }26 27     #endregion28   }


  创建抽象工厂;依赖抽象,而不是依赖具体。

 1   interface AnimalFactory 2   { 3     IKeepAnimal KeepFactory(); 4     IWildAnimal WildFactory(); 5   } 6  7   class DogFacory:AnimalFactory 8   { 9     #region AnimalFactory 成员10 11     public IKeepAnimal KeepFactory()12     {13       return new KeepDog();14     }15 16     public IWildAnimal WildFactory()17     {18       return new WildDog();19     }20 21     #endregion22   }

  鸭子的实现方式也和狗的一样,大家感兴趣的话可以试着自己去写下。

  小结

  工厂方法模式通过让子类决定创建的对象是什么,来达到将对象创建的过程封装的目的。

  抽象工厂模式提供一个接口,用于创建相关或依赖的对象家族,而不需要明确指定哪个类。