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

简单工厂模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,而是通过一个统一的接口来指向新创建的对象。

介绍

在现实生活中,当我们去 4S 店购车时,我们不用考虑汽车的各个部件是如何生产的,而就可以提走一辆爱车。同样的,在软件开发过程中,当我们需要访问数据时,可以使用这种方法直接获取到数据,而不用考虑数据的底层存储是使用哪种存储方式。

类图描述

从上述类图中我们可以发现,IShape 为接口类型,定义了所有形状类型所具有的行为,然后具体的类型分别继承该接口并实现相应行为。接着又定义了一个 ShapeFactory 来统一所有类型的创建,最后,上层通过调用 ShapeFactory 并转递相应参数来获取具体类型的实例对象。

代码实现

1、创建接口 IShape

  1. public interface IShape
  2. {
  3. void Draw();
  4. }

2、定义相应形状类并继承 IShape 接口

  1. public class Circle:IShape
  2. {
  3. public void Draw()
  4. {
  5. Console.WriteLine("I am a Circle");
  6. }
  7. }
  8. public class Rectangle:IShape
  9. {
  10. public void Draw()
  11. {
  12. Console.WriteLine("I am a Rectangle");
  13. }
  14. }
  15. public class Square:IShape
  16. {
  17. public void Draw()
  18. {
  19. Console.WriteLine("I am a Square");
  20. }
  21. }

3、创建一个工厂,用于生产指定类型的实体类对象

  1. public enum ShapeType
  2. {
  3. Circle,
  4. Rectangle,
  5. Square,
  6. }
  7. public class ShapeFactory
  8. {
  9. public IShape GetShape(ShapeType shapeType)
  10. {
  11. IShape shape = null;
  12. switch (shapeType)
  13. {
  14. case ShapeType.Circle:
  15. shape = new Circle();
  16. break;
  17. case ShapeType.Rectangle:
  18. shape = new Rectangle();
  19. break;
  20. case ShapeType.Square:
  21. shape = new Square();
  22. break;
  23. }
  24. return shape;
  25. }
  26. }

4、上层调用

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var factory = new ShapeFactory();
  6. IShape shape = factory.GetShape(ShapeType.Rectangle);
  7. shape.Draw();
  8. Console.ReadKey();
  9. }
  10. }

总结

从上述类图我们可以发现,使用工厂模式可以对复杂对象的创建提供了统一管理。每增加一个类型,都需要增加一个具体类和修改相应的工厂类,对于这一点,在一定程度上会增加系统发杂度。同时对于简单对象的创建,如果也使用这种方式的话就不太合适。

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

本站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号