经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Prototype原型模式
来源:cnblogs  作者:大师兄石头  时间:2021/2/18 15:34:47  对本文有异议

>>返回《C#常用设计模式》

1. 简介

  • 定义
    • 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
  • 使用场景
    • 频繁创建“结构复杂的对象”
  • 注意,克隆的对象是全新的对象,而且是独立

2. 示例

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. namespace ConsoleApplication4
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. GameSys sys = new GameSys();
  14. sys.Run(new NormalActorA(), new FlyActorA(), new WaterActorA());
  15. }
  16. }
  17. public class GameSys
  18. {
  19. public void Run(NormalActor normalActor, FlyActor flyActor, WaterActor waterActor)
  20. {
  21. NormalActor nActor1 = normalActor.Clone();
  22. NormalActor nActor2 = normalActor.Clone();
  23. NormalActor nActor3 = normalActor.Clone();
  24. FlyActor fActor1 = flyActor.Clone();
  25. FlyActor fActor2 = flyActor.Clone();
  26. WaterActor wActor1 = waterActor.Clone();
  27. }
  28. }
  29. #region 抽象类
  30. public abstract class NormalActor
  31. {
  32. public abstract NormalActor Clone();
  33. }
  34. public abstract class FlyActor
  35. {
  36. public abstract FlyActor Clone();
  37. }
  38. public abstract class WaterActor
  39. {
  40. public abstract WaterActor Clone();
  41. }
  42. #endregion
  43. #region 具体实现
  44. public class NormalActorA : NormalActor
  45. {
  46. public override NormalActor Clone()
  47. {
  48. //被拷贝对象成员不存在引用对象时使用,如果存在引用对象那么使用“深拷贝”
  49. return (NormalActor)this.MemberwiseClone();
  50. }
  51. }
  52. public class FlyActorA : FlyActor
  53. {
  54. public override FlyActor Clone()
  55. {
  56. return (FlyActor)this.MemberwiseClone();
  57. }
  58. }
  59. public class WaterActorA : WaterActor
  60. {
  61. public override WaterActor Clone()
  62. {
  63. return (WaterActor)this.MemberwiseClone();
  64. }
  65. }
  66. #endregion
  67. }

3. 优缺点

3.1. 优点

  1. 简化对象的创建过程,通过复制一个已有对象实例可以提高新实例的创建效率
  2. 扩展性好
  3. 提供了简化的创建结构,原型模式中的产品的复制是通过封装在原型类中的克隆方法实现的,无需专门的工厂类来创建产品
  4. 可以通过深克隆的方式保存对象的状态,使用原型模式将对象复制一份并其状态保存起来,以便在需要的时候使用,可辅助实现撤销操作

3.2. 缺点

  1. 需要为每一个类准备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有类进行改造时,需要修改原代码,违背了开闭原则
  2. 在实现深克隆时需要写较复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类必须支持深克隆,实现起来较繁琐

3.3. 原型模式的适用环境

  1. 创建新对象成本较大,新对象可以通过复制已有对象来获得,如果是相似对象,则可以对其成员变量修改
  2. 系统要保存对象的状态,而对象的状态变化很小
  3. 需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更方便

原文链接:http://www.cnblogs.com/BigBrotherStone/p/prototype.html

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

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