翼度科技»论坛 编程开发 .net 查看内容

C# 工厂模式学习

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,而不是通过具体类来实例化对象。工厂模式可以将对象的创建过程封装起来,使代码更具有灵活性和可扩展性。
工厂模式有几种常见的实现方式:

  • 简单工厂模式(Simple Factory Pattern): 简单工厂模式通过一个工厂类来决定创建哪种具体类的实例。这个工厂类通常提供一个静态方法,根据传入的参数创建相应的对象。
  • 工厂方法模式(Factory Method Pattern): 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法使一个类的实例化延迟到其子类。
  • 抽象工厂模式(Abstract Factory Pattern): 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而无需明确指定具体类。通过使用抽象工厂模式,一个类可以实例化一组相关对象,而不需要知道它们的具体类。
简单工厂模式示例

假设我们有一个动物园项目,需要创建不同的动物对象:
  1. // 动物接口
  2. public interface IAnimal
  3. {
  4.     void Speak();
  5. }
  6. // 具体的动物类
  7. public class Dog : IAnimal
  8. {
  9.     public void Speak()
  10.     {
  11.         Console.WriteLine("Woof!");
  12.     }
  13. }
  14. public class Cat : IAnimal
  15. {
  16.     public void Speak()
  17.     {
  18.         Console.WriteLine("Meow!");
  19.     }
  20. }
  21. // 简单工厂类
  22. public static class AnimalFactory
  23. {
  24.     public static IAnimal CreateAnimal(string animalType)
  25.     {
  26.         switch (animalType.ToLower())
  27.         {
  28.             case "dog":
  29.                 return new Dog();
  30.             case "cat":
  31.                 return new Cat();
  32.             default:
  33.                 throw new ArgumentException("Unknown animal type");
  34.         }
  35.     }
  36. }
  37. // 使用示例
  38. class Program
  39. {
  40.     static void Main(string[] args)
  41.     {
  42.         IAnimal animal = AnimalFactory.CreateAnimal("dog");
  43.         animal.Speak();  // 输出:Woof!
  44.     }
  45. }
复制代码
 
工厂方法模式示例

假设我们有一个动物园项目,不同的子类需要创建不同的动物对象:
  1. // 动物接口
  2. public interface IAnimal
  3. {
  4.     void Speak();
  5. }
  6. // 具体的动物类
  7. public class Dog : IAnimal
  8. {
  9.     public void Speak()
  10.     {
  11.         Console.WriteLine("Woof!");
  12.     }
  13. }
  14. public class Cat : IAnimal
  15. {
  16.     public void Speak()
  17.     {
  18.         Console.WriteLine("Meow!");
  19.     }
  20. }
  21. // 工厂接口
  22. public interface IAnimalFactory
  23. {
  24.     IAnimal CreateAnimal();
  25. }
  26. // 具体工厂类
  27. public class DogFactory : IAnimalFactory
  28. {
  29.     public IAnimal CreateAnimal()
  30.     {
  31.         return new Dog();
  32.     }
  33. }
  34. public class CatFactory : IAnimalFactory
  35. {
  36.     public IAnimal CreateAnimal()
  37.     {
  38.         return new Cat();
  39.     }
  40. }
  41. // 使用示例
  42. class Program
  43. {
  44.     static void Main(string[] args)
  45.     {
  46.         IAnimalFactory factory = new DogFactory();
  47.         IAnimal animal = factory.CreateAnimal();
  48.         animal.Speak();  // 输出:Woof!
  49.     }
  50. }
复制代码
抽象工厂模式示例

假设我们有一个动物园项目,需要创建一组相关的对象(例如,动物及其食物):
  1. // 动物接口
  2. public interface IAnimal
  3. {
  4.     void Speak();
  5. }
  6. // 具体的动物类
  7. public class Dog : IAnimal
  8. {
  9.     public void Speak()
  10.     {
  11.         Console.WriteLine("Woof!");
  12.     }
  13. }
  14. public class Cat : IAnimal
  15. {
  16.     public void Speak()
  17.     {
  18.         Console.WriteLine("Meow!");
  19.     }
  20. }
  21. // 食物接口
  22. public interface IFood
  23. {
  24.     void Get();
  25. }
  26. // 具体的食物类
  27. public class DogFood : IFood
  28. {
  29.     public void Get()
  30.     {
  31.         Console.WriteLine("Dog food");
  32.     }
  33. }
  34. public class CatFood : IFood
  35. {
  36.     public void Get()
  37.     {
  38.         Console.WriteLine("Cat food");
  39.     }
  40. }
  41. // 抽象工厂接口
  42. public interface IAnimalFactory
  43. {
  44.     IAnimal CreateAnimal();
  45.     IFood CreateFood();
  46. }
  47. // 具体工厂类
  48. public class DogFactory : IAnimalFactory
  49. {
  50.     public IAnimal CreateAnimal()
  51.     {
  52.         return new Dog();
  53.     }
  54.     public IFood CreateFood()
  55.     {
  56.         return new DogFood();
  57.     }
  58. }
  59. public class CatFactory : IAnimalFactory
  60. {
  61.     public IAnimal CreateAnimal()
  62.     {
  63.         return new Cat();
  64.     }
  65.     public IFood CreateFood()
  66.     {
  67.         return new CatFood();
  68.     }
  69. }
  70. // 使用示例
  71. class Program
  72. {
  73.     static void Main(string[] args)
  74.     {
  75.         IAnimalFactory factory = new DogFactory();
  76.         IAnimal animal = factory.CreateAnimal();
  77.         IFood food = factory.CreateFood();
  78.         animal.Speak();  // 输出:Woof!
  79.         food.Get();      // 输出:Dog food
  80.     }
  81. }
复制代码
以上是三种工厂模式的基本示例,可以根据具体需求选择合适的工厂模式来实现代码的创建和管理。如果希望在增加新动物类型时尽量减少对现有类的修改,推荐使用工厂方法模式。工厂方法模式的设计使得每新增一种动物,只需增加一个对应的工厂类和具体的动物类,而无需修改已有的代码,从而符合开闭原则(即对扩展开放,对修改关闭)。
使用工厂方法模式

下面是一个更完善的工厂方法模式示例,展示了如何在增加新动物时,尽量减少对现有代码的修改。
  1. // 动物接口
  2. public interface IAnimal
  3. {
  4.     void Speak();
  5. }
  6. // 具体的动物类
  7. public class Dog : IAnimal
  8. {
  9.     public void Speak()
  10.     {
  11.         Console.WriteLine("Woof!");
  12.     }
  13. }
  14. public class Cat : IAnimal
  15. {
  16.     public void Speak()
  17.     {
  18.         Console.WriteLine("Meow!");
  19.     }
  20. }
  21. // 新增的动物类
  22. public class Bird : IAnimal
  23. {
  24.     public void Speak()
  25.     {
  26.         Console.WriteLine("Tweet!");
  27.     }
  28. }
  29. // 工厂接口
  30. public interface IAnimalFactory
  31. {
  32.     IAnimal CreateAnimal();
  33. }
  34. // 具体工厂类
  35. public class DogFactory : IAnimalFactory
  36. {
  37.     public IAnimal CreateAnimal()
  38.     {
  39.         return new Dog();
  40.     }
  41. }
  42. public class CatFactory : IAnimalFactory
  43. {
  44.     public IAnimal CreateAnimal()
  45.     {
  46.         return new Cat();
  47.     }
  48. }
  49. // 新增的动物工厂类
  50. public class BirdFactory : IAnimalFactory
  51. {
  52.     public IAnimal CreateAnimal()
  53.     {
  54.         return new Bird();
  55.     }
  56. }
  57. // 使用示例
  58. class Program
  59. {
  60.     static void Main(string[] args)
  61.     {
  62.         List<IAnimalFactory> factories = new List<IAnimalFactory>
  63.         {
  64.             new DogFactory(),
  65.             new CatFactory(),
  66.             new BirdFactory()  // 新增的工厂只需在这里添加
  67.         };
  68.         foreach (var factory in factories)
  69.         {
  70.             IAnimal animal = factory.CreateAnimal();
  71.             animal.Speak();
  72.         }
  73.     }
  74. }
复制代码
在这个示例中,新增一种动物只需:

  • 创建新的具体动物类,例如 Bird。
  • 创建对应的工厂类,例如 BirdFactory。
  • 在使用的地方添加新的工厂实例,例如在 factories 列表中添加 new BirdFactory()。
这样做的好处是每增加一个新动物类型,不需要修改现有的工厂类或具体的动物类,只需要添加新的类和工厂即可,从而降低了代码修改的风险和复杂度。
使用反射和配置来进一步减少修改

如果希望在增加动物时连代码都不需要改动,可以考虑使用反射和配置文件的方式。通过配置文件定义动物类型和对应的工厂类,然后使用反射动态加载:
  1. // 动物接口和具体的动物类(同上)
  2. // 工厂接口和具体工厂类(同上)
  3. // 使用反射加载工厂类
  4. class Program
  5. {
  6.     static void Main(string[] args)
  7.     {
  8.         // 假设配置文件中定义了动物类型和对应的工厂类
  9.         var factoryTypes = new List<string>
  10.         {
  11.             "DogFactory",
  12.             "CatFactory",
  13.             "BirdFactory"  // 配置文件中新增的工厂类
  14.         };
  15.         var factories = new List<IAnimalFactory>();
  16.         foreach (var factoryType in factoryTypes)
  17.         {
  18.             var type = Type.GetType(factoryType);
  19.             if (type != null && typeof(IAnimalFactory).IsAssignableFrom(type))
  20.             {
  21.                 var factory = (IAnimalFactory)Activator.CreateInstance(type);
  22.                 factories.Add(factory);
  23.             }
  24.         }
  25.         foreach (var factory in factories)
  26.         {
  27.             IAnimal animal = factory.CreateAnimal();
  28.             animal.Speak();
  29.         }
  30.     }
  31. }
复制代码
接口与继承结合使用

工厂模式主要使用了接口、继承,在C#中,接口和继承是面向对象编程的重要概念。接口定义了一组方法和属性,而继承允许一个类从另一个类继承其成员。接口可以实现多重继承,而类只能继承一个基类。通常情况下,接口和继承可以结合使用,以充分利用它们各自的优点。通过这种方式,基类可以提供一些通用的实现,而接口可以定义特定的行为。
  1. // 接口
  2. public interface IAnimal
  3. {
  4.     void Speak();
  5.     void Eat();
  6. }
  7. // 基类
  8. public class Animal
  9. {
  10.     public void Sleep()
  11.     {
  12.         Console.WriteLine("Sleeping...");
  13.     }
  14. }
  15. // 派生类实现接口
  16. public class Dog : Animal, IAnimal
  17. {
  18.     public void Speak()
  19.     {
  20.         Console.WriteLine("Woof!");
  21.     }
  22.     public void Eat()
  23.     {
  24.         Console.WriteLine("Dog is eating.");
  25.     }
  26. }
  27. public class Cat : Animal, IAnimal
  28. {
  29.     public void Speak()
  30.     {
  31.         Console.WriteLine("Meow!");
  32.     }
  33.     public void Eat()
  34.     {
  35.         Console.WriteLine("Cat is eating.");
  36.     }
  37. }
  38. // 使用示例
  39. class Program
  40. {
  41.     static void Main(string[] args)
  42.     {
  43.         IAnimal dog = new Dog();
  44.         dog.Speak(); // 输出:Woof!
  45.         dog.Eat();   // 输出:Dog is eating.
  46.         IAnimal cat = new Cat();
  47.         cat.Speak(); // 输出:Meow!
  48.         cat.Eat();   // 输出:Cat is eating.
  49.         // 使用基类方法
  50.         Animal animalDog = (Animal)dog;
  51.         animalDog.Sleep(); // 输出:Sleeping...
  52.         Animal animalCat = (Animal)cat;
  53.         animalCat.Sleep(); // 输出:Sleeping...
  54.     }
  55. }
复制代码
总结


  • 接口:定义了一组必须实现的方法和属性,没有实现代码。支持多重继承,使得类可以实现多个接口。
  • 继承:用于从现有类创建新类,继承基类的成员。每个类只能有一个基类,但可以实现多个接口。
  • 结合使用:通过将接口和继承结合使用,可以实现代码的高复用性和灵活性。
通过上述示例,可以看到如何使用接口和继承来设计灵活且可扩展的应用程序结构。这样既能充分利用基类的通用功能,又能通过接口实现特定的行为。

来源:https://www.cnblogs.com/hlyt/p/18215101
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具