看了网络上很多关于设计模式的方法,有的模式看起来相似,但本质还是区别很大的.像简单工厂,工厂方法和抽象工厂就有很明显的区别.

有一个比较好理解的例子,在这跟大家介绍下:
1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.

所以我个人认为,

  • 简单工厂是一个工厂只生产一类的产品,面对的是具体的类
  • 工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品
  • 抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品

具体例子:司机开车 (感觉这个例子还是有点问题)

1.简单工厂

  1. using System;
  2. public interface ICar
  3. {
  4. void run();
  5. }
  6. public class BMWCar : ICar
  7. {
  8. public void run()
  9. {
  10. Console.WriteLine("BMWCar run");
  11. }
  12. }
  13. public class BenzCar : ICar
  14. {
  15. public void run()
  16. {
  17. Console.WriteLine("BenzCar run");
  18. }
  19. }
  20. public class Driver
  21. {
  22. public static ICar DriverCar(string carType)
  23. {
  24. switch (carType)
  25. {
  26. case "BMWCar": return new BMWCar();
  27. case "BenzCar": return new BenzCar();
  28. default: throw new Exception();
  29. }
  30. }
  31. }
  32. public class Client
  33. {
  34. public static void Main()
  35. {
  36. ICar myCar = Driver.DriverCar("BenzCar");
  37. myCar.run();
  38. Console.Read();
  39. }
  40. }

心得: 优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类

2.工厂方法

  1. using System;
  2. public interface ICar
  3. {
  4. void run();
  5. }
  6. public class BMWCar : ICar
  7. {
  8. public void run()
  9. {
  10. Console.WriteLine("BMWCar run");
  11. }
  12. }
  13. public class BenzCar : ICar
  14. {
  15. public void run()
  16. {
  17. Console.WriteLine("BenzCar run");
  18. }
  19. }
  20. public abstract class Driver
  21. {
  22. public abstract ICar DriverCar();
  23. }
  24. public class BMWDriver : Driver
  25. {
  26. public override ICar DriverCar()
  27. {
  28. return new BMWCar();
  29. }
  30. }
  31. public class BenzDriver : Driver
  32. {
  33. public override ICar DriverCar()
  34. {
  35. return new BenzCar();
  36. }
  37. }
  38. class Client
  39. {
  40. public static void Main()
  41. {
  42. Driver myDriver = new BenzDriver();
  43. ICar myCar = myDriver.DriverCar();
  44. myCar.run();
  45. Console.Read();
  46. }
  47. }

心得: 优点是符合了开放-封闭原则(OCP),从整体上还看不出什么缺点.

3.抽象工厂

  1. using System;
  2. public interface IBusinessCar
  3. {
  4. void run();
  5. }
  6. public interface ISportCar
  7. {
  8. void run();
  9. }
  10. public class BMWBusinessCar : IBusinessCar
  11. {
  12. public void run()
  13. {
  14. Console.WriteLine("BMWCar run");
  15. }
  16. }
  17. public class BenzBusinessCar : IBusinessCar
  18. {
  19. public void run()
  20. {
  21. Console.WriteLine("BenzBusinessCar run");
  22. }
  23. }
  24. public class BMWSportCar:ISportCar
  25. {
  26. public void run()
  27. {
  28. Console.WriteLine("BMWSportCar run");
  29. }
  30. }
  31. public class BenzSportCar:ISportCar
  32. {
  33. public void run()
  34. {
  35. Console.WriteLine("BenzSportCar run");
  36. }
  37. }
  38. public interface IDriver
  39. {
  40. IBusinessCar BusinessCarDriver();
  41. ISportCar SportCarDriver();
  42. }
  43. public class BMWDriver:IDriver
  44. {
  45. public IBusinessCar BusinessCarDriver()
  46. {
  47. return new BMWBusinessCar();
  48. }
  49. public ISportCar SportCarDriver()
  50. {
  51. return new BMWSportCar();
  52. }
  53. }
  54. public class BenzDriver:IDriver
  55. {
  56. public IBusinessCar BusinessCarDriver()
  57. {
  58. return new BenzBusinessCar();
  59. }
  60. public ISportCar SportCarDriver()
  61. {
  62. return new BenzSportCar();
  63. }
  64. }
  65. class Client
  66. {
  67. public static void Main()
  68. {
  69. IDriver myDriver =new BenzDriver();
  70. ISportCar myCar = myDriver.SportCarDriver();
  71. myCar.run();
  72. Console.Read();
  73. }
  74. }

心得: 工厂的工厂,抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.