案例:
某即时战略游戏,你训练出来各种很强的战士。
为了增加游戏的可玩性,增加了一种复制魔法。实施该魔法,可以复制任意的战士。
你会怎样考虑这个设计?

在继续阅读之前,请先认真思考并写出你的设计,这样对你更好地理解本模式将会更有帮助。

分析:
1.无疑增加一个复制的方法能解决这个问题。
2.专门写一个复制类吗?传入一个战士,然后返回一个复制的战士,这样可行吗?这样做有以下问题:
   1)游戏还在设计中,战士的品种还会不断演变,每增加一个品种,或者修改某品种的战士,复制类就需要修改代码。
   2)为了复制好战士,复制类需要访问战士内部的属性,这样战士类可能需要暴露内部信息。

通过“原型”这两个中文字来理解原型模式是有点难度的,我们往往会用“原型开发”的“原型”来理解。
我们看看英文原型(Prototype)的解释:
the first design of something from which other forms are copied or developed.

原型模式的要点
1.利用现成对象制作新的对象。
2.被复制的对象,需要实现clone(克隆)接口:Soldier newSoldier = oldSoldier.Clone();

类图如下

说明:
1.每种战士实现自己的复制方法,自己可以访问自己的内部信息,复制起来很方便,也不需要对外暴露内部信息。

2.增加或者修改战士的种类,只需要修改该类便可,其它代码不受影响。

请看下一文……
 
 
 
 
 
 
 
 
 
 
 
 

作者:张传波

创新工场创业课堂(敏捷课程)讲师

软件研发管理资深顾问

CMMI首席专家

《火球——UML大战需求分析》作者

《硬啃设计模式》作者

www.umlonline.org创办人

最新文章

  1. Centos 7 开启端口
  2. SharePoint 2013 图文开发系列之计时器任务
  3. java web 学习 --第六天(Java三级考试)
  4. Linux的sleep()和usleep()的使用和区别
  5. Apache Shiro系列教程之三:Shiro的结构
  6. C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
  7. Java NIO框架Mina、Netty、Grizzly介绍与对比(zz)
  8. js 模拟ajax方式提交数据
  9. hadoop conf中xml文件修改
  10. 【BZOJ 1821】 [JSOI2010]Group 部落划分 Group
  11. fiddler Composer 构建请求
  12. Hadoop:Task process exit with nonzero status of 1 异常
  13. FTP之虚拟用户
  14. Autofac in webapi2
  15. ngnix服务器搭建
  16. VB用API模拟截屏键PrintScreen
  17. Redis 持久化之RDB和AOF
  18. Confluence 6 为翻译显示用户界面的键(Key)名称
  19. AWT和Swing的关系
  20. matlab global persistent变量

热门文章

  1. STM32 串口通信
  2. shell script执行的几种方式
  3. [leetcode shell]194. Transpose File
  4. 获取Android apk的包名
  5. 2017-2018-1 20162307 Dijkstra算法
  6. [COGS2580]偏序 II
  7. bzoj 3653
  8. Python168的学习笔记1
  9. BZOJ 2749 HAOI 2012 外星人 数论 欧拉函数
  10. euclidea 3.0 全三星 攻略