经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式系列- 抽象工厂模式
来源:cnblogs  作者:hippieZhou  时间:2018/12/10 9:42:10  对本文有异议

抽象工厂是基于简单工厂发展而来的,通过抽象工厂,我们可以创建多种类型的工厂,并且依据具体业务需求而在具体工厂里面进行任意拼装组合。

介绍

在现实世界中,汽车制作行业有各种各样的工厂,每个工厂都需要具有生产轮胎、汽车引擎等部件的能力,但是针对具体的工厂,每个部件的生产又各不相同,所有在软件开发过程中,当我们为客户端制作各种各样的皮肤时,就可以参考这种设计模式。

类图描述

从上图我们可以发现,我们通过定义一个抽象工厂 AbstractFactory 来约束具体每种工厂所具备的能力,然后通过定义 IShapeIColor 来约束具体每个部件所具备的行为。接着,对相应接口进行继承并实现相应行为从而达到能生产具体某种类型的对象。最后,上层公共调用工厂管理类来获取具体的产品对象,而对其内部构成不用关心。

代码实现

1、定义部件接口

  1. public interface IColor
  2. {
  3. void Fill();
  4. }
  5. public interface IShape
  6. {
  7. void Draw();
  8. }

2、定义各种类型的部件元素

  1. public class Blue:IColor
  2. {
  3. public void Fill()
  4. {
  5. Console.WriteLine("Filled with blue");
  6. }
  7. }
  8. public class Green : IColor
  9. {
  10. public void Fill()
  11. {
  12. Console.WriteLine("Filled with green");
  13. }
  14. }
  15. class Red:IColor
  16. {
  17. public void Fill()
  18. {
  19. Console.WriteLine("Filled with red");
  20. }
  21. }
  22. public class Circle:IShape
  23. {
  24. public void Draw()
  25. {
  26. Console.WriteLine("I am a Circle");
  27. }
  28. }
  29. public class Rectangle:IShape
  30. {
  31. public void Draw()
  32. {
  33. Console.WriteLine("I am a Rectangle");
  34. }
  35. }
  36. public class Square : IShape
  37. {
  38. public void Draw()
  39. {
  40. Console.WriteLine("I am a Square");
  41. }
  42. }

3、定义抽象工厂

  1. public abstract class AbstractFactory
  2. {
  3. public abstract IColor GetColor(ColorType colorType);
  4. public abstract IShape GetShape(ShapeType shapeType);
  5. }

3、定义具体工厂

  1. public class ColorFactory:AbstractFactory
  2. {
  3. public override IColor GetColor(ColorType colorType)
  4. {
  5. IColor color = null;
  6. switch (colorType)
  7. {
  8. case ColorType.Blue:
  9. color= new Blue();
  10. break;
  11. case ColorType.Green:
  12. color =new Green();
  13. break;
  14. case ColorType.Red:
  15. color = new Red();
  16. break;
  17. default:
  18. throw new ArgumentOutOfRangeException(nameof(colorType), colorType, null);
  19. }
  20. return color;
  21. }
  22. public override IShape GetShape(ShapeType shapeType)
  23. {
  24. return null;
  25. }
  26. }
  27. public class ShapeFactory:AbstractFactory
  28. {
  29. public override IColor GetColor(ColorType colorType)
  30. {
  31. return null;
  32. }
  33. public override IShape GetShape(ShapeType shapeType)
  34. {
  35. IShape shape = null;
  36. switch (shapeType)
  37. {
  38. case ShapeType.Circle:
  39. shape = new Circle();
  40. break;
  41. case ShapeType.Rectangle:
  42. shape = new Rectangle();
  43. break;
  44. case ShapeType.Square:
  45. shape = new Square();
  46. break;
  47. default:
  48. throw new ArgumentOutOfRangeException(nameof(shapeType), shapeType, null);
  49. }
  50. return shape;
  51. }
  52. }

4、定义工厂管理类

  1. public class FactoryProducer
  2. {
  3. public static Factories.AbstractFactory GetFactory(ProducerType producerType)
  4. {
  5. switch (producerType)
  6. {
  7. case ProducerType.Shape:
  8. return new ShapeFactory();
  9. case ProducerType.Color:
  10. return new ColorFactory();
  11. default:
  12. throw new ArgumentOutOfRangeException(nameof(producerType), producerType, null);
  13. }
  14. }
  15. }

5、上层调用

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Factories.AbstractFactory shapeFactory = FactoryProducer.GetFactory(ProducerType.Shape);
  6. IShape shape = shapeFactory.GetShape(ShapeType.Circle);
  7. shape.Draw();
  8. Factories.AbstractFactory colorFactory = FactoryProducer.GetFactory(ProducerType.Color);
  9. IColor color = colorFactory.GetColor(ColorType.Red);
  10. color.Fill();
  11. Console.ReadKey();
  12. }
  13. }

总结

当一个产品集合中的多个部件可以任意组合时,使用抽象工厂较为合适,这使得每一层的类型创建较为具体,关注点较为统一。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号