深入‹¹…出å•实例Singleton设计模å¼
陈皓
å•实例Singleton设计模å¼å¯èƒ½æ˜¯è¢«è®¨è®ºå’Œä‹É用的最òq¿æ³›çš„一个设计模å¼äº†åQŒè¿™å¯èƒ½ä¹Ÿæ˜¯é¢è¯•ä¸é—®å¾—最多的一个设计模å¼äº†ã€‚这个设计模å¼ä¸»è¦ç›®çš? 是想在整个系¾lŸä¸åªèƒ½å‡ºçŽ°ä¸€ä¸ªç±»çš„å®žä¾‹ã€‚è¿™æ ·åšå½“ç„¶æ˜¯æœ‰å¿…ç„¶çš„ï¼Œæ¯”å¦‚ä½ çš„è½¯äšg的全局é…置信æ¯åQŒæˆ–者是一个FactoryåQŒæˆ–是一个主控类åQŒç‰½{‰ã€‚ä½ å¸Œæœ›˜q? 个类在整个系¾lŸä¸åªèƒ½å‡ºçŽ°ä¸€ä¸ªå®žä¾‹ã€‚å½“ç„Óž¼Œä½œäؓ一个技术负责ähçš„ä½ åQŒä½ 当然有æƒåˆ©é€šè¿‡ä½¿ç”¨éžæŠ€æœ¯çš„æ‰‹æ®µæ¥è¾¾åˆîC½ çš„ç›®çš„ã€‚æ¯”å¦‚ï¼šä½ åœ¨å›¢é˜Ÿå†…éƒ¨æ˜Žæ–‡è§? 定,“XX¾cÕdªèƒ½æœ‰ä¸€ä¸ªå…¨å±€å®žä¾‹åQŒå¦‚æžœæŸäºÞZ‹É用两‹Æ¡ä»¥ä¸Šï¼Œé‚£ä¹ˆè¯¥ähž®†è¢«å¤„于2000元的¾|𿬾åQ?#8221;åQˆå‘µå‘µï¼‰åQŒä½ 当然有惘q™ä¹ˆåšã€‚ä½†æ˜¯å¦‚æžœä½ çš„è®¾è®¡çš„æ˜¯ä¸œè¥¿æ˜¯ ä¸€ä¸ªç±»åº“ï¼Œæˆ–æ˜¯ä¸€ä¸ªéœ€è¦æä¾›ç»™ç”¨æˆ·ä½¿ç”¨çš„APIåQŒææ€•ä½ çš„è¿™™å¹è§„å®šå°†ä¼šå¤±æ•ˆã€‚å› ä¸ºï¼Œä½ æ— æƒè¦æ±‚别äºÞZ¼šé‚£ä¹ˆåšã€‚所以,˜q™å°±æ˜¯äؓ什么,我们希望通过使用技术的 手段æ¥è¾¾æˆè¿™æ ·ä¸€ä¸ªç›®çš„çš„åŽŸå› ã€?/p>
本文会带ç€ä½ 深入整个Singleton的世界,当然åQŒæˆ‘会放弃ä‹É用C++è¯è¨€è€Œæ”¹ç”¨Javaè¯è¨€åQŒå› ä¸ÞZ‹É用Java˜q™ä¸ªè¯è¨€å¯èƒ½æ›´å®¹æ˜“让我说明一些事情ã€?/p>
˜q™é‡ŒåQŒæˆ‘ž®†ç›´æŽ¥ç»™å‡ÞZ¸€ä¸ªSingleton的简å•实玎ͼŒå› äØ“æˆ‘ç›¸ä¿¡ä½ å·²ç»æœ‰è¿™æ–šw¢çš„一些基¼‹€äº†ã€‚我们姑且把˜q™å…·ç‰ˆæœ¬å«åš1.0ç‰?/p>
在上é¢çš„实例ä¸ï¼Œæˆ‘想说明下é¢å‡ 个Singleton的特点:åQˆä¸‹é¢è¿™äº›ä¸œè¥¿å¯èƒ½æ˜¯ž®½äh皆知的,没有什么新鲜的åQ?/p>
当然åQŒå¦‚æžœä½ è§‰å¾—çŸ¥é“了上é¢è¿™äº›äº‹æƒ…厞®±å¦æˆäº†åQŒé‚£æˆ‘ç»™ä½ å½“å¤´æ£’å–一下了åQŒäº‹æƒ…远˜qœæ²¡æœ‰é‚£ä¹ˆç®€å•ã€?/p>
上é¢çš„这个程åºå˜åœ¨æ¯”较严é‡çš„问题åQŒå› 为是全局性的实例åQŒæ‰€ä»¥ï¼Œåœ¨å¤š¾U¿ç¨‹æƒ…况下,所有的全局å…׃ín的东襉Kƒ½ä¼šå˜å¾—éžå¸¸çš„å±é™©åQŒè¿™ä¸ªä¹Ÿä¸€æ øP¼Œåœ¨å¤š¾U¿ç¨‹æƒ? 况下åQŒå¦‚果多个线½E‹åŒæ—¶è°ƒç”¨getInstance()çš„è¯åQŒé‚£ä¹ˆï¼Œå¯èƒ½ä¼šæœ‰å¤šä¸ª˜q›ç¨‹åŒæ—¶é€šè¿‡ (singleton== null)çš„æ¡ä»¶æ£€æŸ¥ï¼ŒäºŽæ˜¯åQŒå¤šä¸ªå®žä¾‹å°±åˆ›å¾å‡ºæ¥åQŒåƈ且很å¯èƒ½é€ æˆå†…å˜æ³„露问题。嗯åQŒç†Ÿæ‚‰å¤š¾U¿ç¨‹çš„ä½ ä¸€å®šä¼šè¯´â€”â€?#8220;我们需è¦çº¿½E‹äº’æ–¥æˆ–åŒæ¥”åQŒæ²¡é”™ï¼Œæˆ‘们 需è¦è¿™ä¸ªäº‹æƒ…,于是我们的Singletonå‡çñ”æˆ?.1版,如下所½Cºï¼š
嗯,使用了Javaçš„synchronizedæ–ÒŽ³•åQŒçœ‹èµäh¥ä¸é”™å“¦ã€‚应该没有问题了å§ï¼ŸåQé”™åQè¿™˜q˜æ˜¯æœ‰é—®é¢˜ï¼ä¸ÞZ»€ä¹ˆå‘¢åQŸå‰é¢å·²¾l说˜q‡ï¼Œå¦‚果有多个线 ½E‹åŒæ—‰™€šè¿‡(singleton== null)çš„æ¡ä»¶æ£€æŸ¥ï¼ˆå› 䨓他们òq¶è¡Œ˜q行åQ‰ï¼Œè™½ç„¶æˆ‘们的synchronizedæ–ÒŽ³•ä¼šå¸®åŠ©æˆ‘ä»¬åŒæ¥æ‰€æœ‰çš„¾U¿ç¨‹åQŒè®©æˆ‘们òq¶è¡Œ¾U¿ç¨‹å˜æˆä¸²è¡Œçš„一个一个去 newåQŒé‚£ä¸è¿˜æ˜¯ä¸€æ ïLš„å—ï¼ŸåŒæ ·ä¼šå‡ºçŽ°å¾ˆå¤šå®žä¾‹ã€‚å—¯åQŒç¡®å®žå¦‚æ¤ï¼çœ‹æ¥åQŒè¿˜å¾—把那个判æ–(singleton== null)æ¡äšgä¹ŸåŒæ¥è“væ¥ã€‚于是,我们的Singleton冿¬¡å‡çñ”æˆ?.2版本åQŒå¦‚下所½Cºï¼š
ä¸é”™ä¸é”™åQŒçœ‹ä¼¼å¾ˆä¸é”™äº†ã€‚在多线½E‹ä¸‹åº”该没有什么问题了åQŒä¸æ˜¯å—åQŸçš„¼‹®æ˜¯˜q™æ ·çš„,1.2版的Singleton在多¾U¿ç¨‹ä¸‹çš„¼‹®æ²¡æœ‰é—®é¢˜äº†åQŒå› 为我ä»? åŒæ¥äº†æ‰€æœ‰çš„¾U¿ç¨‹ã€‚åªä¸è¿‡å˜?#8230;…åQŒä»€ä¹ˆï¼ŸåQ还ä¸è¡ŒåQŸï¼æ˜¯çš„åQŒè¿˜æ˜¯æœ‰ç‚¹å°é—®é¢˜åQŒæˆ‘们本æ¥åªæ˜¯æƒ³è®©new˜q™ä¸ªæ“作òq¶è¡Œž®±å¯ä»¥äº†åQŒçŽ°åœ¨ï¼Œåªè¦æ˜¯è¿›å…? getInstance()的线½E‹éƒ½å¾—åŒæ¥å•ŠåQŒæ³¨æ„,创å¾å¯¹è±¡çš„åŠ¨ä½œåªæœ‰ä¸€‹Æ¡ï¼ŒåŽé¢çš„动作全是读å–那个æˆå‘˜å˜é‡ï¼Œ˜q™äº›è¯Õd–的动作ä¸éœ€è¦çº¿½E‹åŒæ¥å•Šã€‚è¿™æ ïLš„ 作法感觉éžå¸¸æžç«¯å•Šï¼Œä¸ÞZº†ä¸€ä¸ªåˆå§‹åŒ–的创建动作,居然让我们达上了所有的è¯ÀL“作,严é‡å½±å“åŽç®‹çš„æ€§èƒ½å•Šï¼
˜q˜å¾—改ï¼å—¯ï¼Œçœ‹æ¥åQŒåœ¨¾U¿ç¨‹åŒæ¥å‰è¿˜å¾—åŠ ä¸€ä¸?singleton== null)çš„æ¡ä»¶åˆ¤æ–,如果对象已ç»åˆ›å¾äº†ï¼Œé‚£ä¹ˆž®×ƒ¸éœ€è¦çº¿½E‹çš„åŒæ¥äº†ã€‚OKåQŒä¸‹é¢æ˜¯1.3版的Singletonã€?/p>
感觉代ç 开始å˜å¾—æœ‰ç‚¹ç½—å—¦å’Œå¤æ‚了,ä¸è¿‡åQŒè¿™å¯èƒ½æ˜¯æœ€ä¸é”™çš„一个版本了åQŒè¿™ä¸ªç‰ˆæœ¬åˆå?#8220;åŒé‡‹‚€æŸ?#8221;Double-Checkã€‚ä¸‹é¢æ˜¯è¯´æ˜ŽåQ?/p>
相当ä¸é”™å•Šï¼Œòq²å¾—éžå¸¸æ¼‚亮åQ请大家为我们的1.3版è“v立鼓掌ï¼
怎么åQŸè¿˜æœ‰é—®é¢˜ï¼ŸåQ当然还有,误‚®°ä½ä¸‹é¢è¿™æ¡è§„则—â€?#8220;æ— è®ºä½ çš„ä»£ç 写得有多好,其åªèƒ½åœ¨ç‰¹å®šçš„范围内工作åQŒè¶…凸™¿™ä¸ªèŒƒå›´å°±è¦å‡ºBugäº?/strong>”åQŒè¿™æ˜?#8220;陈弽W¬ä¸€å®šç†”åQŒå‘µå‘üc€‚ä½ èƒ½æƒ³ä¸€æƒŒ™¿˜æœ‰ä»€ä¹ˆæƒ…况会让这个我们上é¢çš„代ç 出问题å—åQ?/p>
在C++ä¸‹ï¼Œæˆ‘ä¸æ˜¯å¾ˆå¥½ä‹D例,但是在Java的环境下åQŒå˜¿å˜¿ï¼Œ˜q˜æ˜¯è®©æˆ‘们æ¥çœ‹çœ‹ä¸‹é¢çš„一些å例和一些别的事情的讨论åQ?strong>当然åQŒæœ‰äº›å例å¯èƒ½å±žäºŽé’»ç‰›è§’ž®–,å¯èƒ½æœ‰ç‚¹å¦é™¢‹z¾ï¼Œä¸è¿‡ä¹Ÿä¸æŽ’除其实际å¯èƒ½æ€§ï¼Œž®Þq®—是æä¸ªé†’å?/strong>åQ‰ï¼š
其一ã€Class Loader。ä¸çŸ¥é“ä½ å¯¹Javaçš„Class Loader熟悉å—?“¾c»è£…载器”åQŸï¼C++坿²¡æœ‰è¿™ä¸ªä¸œè¥¿å•Šã€‚这是JavaåŠ¨æ€æ€§çš„æ ¸å¿ƒã€‚顾忀义åQŒç±»è£…è²å™¨æ˜¯ç”¨æ¥æŠŠç±»(class)装貘q›JVMçš„ã€? JVM规范定义了两¿U类型的¾c»è£…载器åQšå¯åŠ¨å†…è£…è²å™?bootstrap)和用戯‚‡ªå®šä¹‰è£…è²å™?user-defined class loader)ã€? 在一个JVMä¸å¯èƒ½å˜åœ¨å¤šä¸ªClassLoaderåQŒæ¯ä¸ªClassLoader拥有自己的NameSpace。一个ClassLoaderåªèƒ½æ‹¥æœ‰ä¸€ä¸? class对象¾cÕdž‹çš„实例,但是ä¸åŒçš„ClassLoaderå¯èƒ½æ‹¥æœ‰ç›¸åŒçš„class对象实例åQŒè¿™æ—¶å¯èƒ½äñ”生致命的问题。如ClassLoaderAåQ? 装è²äº†ç±»A的类型实例A1åQŒè€ŒClassLoaderBåQŒä¹Ÿè£…è²äº†ç±»A的对象实例A2。逻辑上讲A1=A2åQŒä½†æ˜¯ç”±äºŽA1å’ŒA2æ¥è‡ªäºŽä¸åŒçš„ ClassLoaderåQŒå®ƒä»¬å®žé™…上是完全ä¸åŒçš„åQŒå¦‚æžœAä¸å®šä¹‰äº†ä¸€ä¸ªé™æ€å˜é‡cåQŒåˆ™c在ä¸åŒçš„ClassLoaderä¸çš„值是ä¸åŒçš„ã€?/p>
于是åQŒå¦‚果咱们的Singleton 1.3版本如果é¢å¯¹ç€å¤šä¸ªClass Loaderä¼šæ€Žä¹ˆæ øP¼Ÿå‘µå‘µåQŒå¤šä¸ªå®žä¾‹åŒæ ·ä¼šè¢«å¤šä¸ªClass Loader创å¾å‡ºæ¥åQŒå½“ç„Óž¼Œ˜q™ä¸ªæœ‰ç‚¹ç‰µå¼ºåQŒä¸˜q‡ä»–¼‹®å®žå˜åœ¨ã€‚éš¾é“æˆ‘ä»¬è¿˜è¦æ•´å‡ÞZ¸ª1.4版å—åQŸå¯æ˜¯ï¼Œæˆ‘们怎么å¯èƒ½åœ¨æˆ‘çš„Singleton¾cÖM¸æ“作 Class Loader啊?是的åQŒä½ æ ÒŽœ¬ä¸å¯èƒ½ã€‚在˜q™ç§æƒ…å†µä¸‹ï¼Œä½ èƒ½åšçš„åªæœ‰æ˜¯â€”â€?#8220;ä¿è¯å¤šä¸ªClass Loaderä¸ä¼šè£…è²åŒä¸€ä¸ªSingleton”ã€?/p>
其二ã€åºä¾‹åŒ–ã€?/strong>如果我们的这个Singleton¾cÀL˜¯ä¸€ä¸ªå…³äºŽæˆ‘们程åºé…¾|®ä¿¡æ¯çš„¾c…R€‚我们需è¦å®ƒæœ‰åºåˆ—化的功能,那么åQŒå½“ååºåˆ—化的时候,我们ž®†æ— 法控制别äºÞZ¸å¤šæ¬¡ååºåˆ—化。丘q‡ï¼Œæˆ‘们å¯ä»¥åˆ©ç”¨ä¸€ä¸‹Serializable接å£çš„readResolve()æ–ÒŽ³•åQŒæ¯”如:
其三ã€å¤šä¸ªJava虚拟机ã€?/strong>如果我们的程åºè¿è¡Œåœ¨å¤šä¸ªJava的虚拟机ä¸ã€‚什么?多个虚拟机?˜q™æ˜¯ä¸€¿Uä»€ä¹ˆæ ·çš„æƒ…å†µå•Šã€‚å—¯åQŒè¿™¿U情冉|˜¯æœ‰ç‚¹æžç«¯åQŒä¸˜q‡è¿˜æ˜¯å¯èƒ½å‡ºçŽŽÍ¼Œæ¯”如EJB或RMI之æµçš„东è¥Ñ€‚è¦åœ¨è¿™¿U环境下é¿å…多实例,看æ¥åªèƒ½é€šè¿‡è‰¯å¥½çš„è®¾è®¡æˆ–éžæŠ€æœ¯æ¥è§£å†³äº†ã€?/p>
å…¶å››åQŒvolatileå˜é‡ã€?/strong>关于volatile˜q™ä¸ªå…³é”®å—所声明的å˜é‡å¯ä»¥è¢«çœ‹ä½œæ˜¯ä¸€¿U? “½E‹åº¦è¾ƒè½»çš„åŒæ¥synchronized”åQ›ä¸Ž synchronized å—相比,volatile å˜é‡æ‰€éœ€çš„ç¼–ç 较ž®‘,òq¶ä¸”˜q行时开销也较ž®‘,但是它所能实现的功能也仅是synchronized的一部分。当ç„Óž¼Œå¦‚å‰é¢æ‰€˜qŽÍ¼Œæˆ‘们需è¦çš„ Singletonåªæ˜¯åœ¨åˆ›å»ºçš„æ—¶å€™çº¿½E‹åŒæ¥ï¼Œè€ŒåŽé¢çš„è¯Õd–则ä¸éœ€è¦åŒæ¥ã€‚所以,volatileå˜é‡òq¶ä¸èƒ½å¸®åŠ©æˆ‘ä»¬å³èƒ½è§£å†³é—®é¢˜ï¼Œåˆæœ‰å¥½çš„æ€§èƒ½ã€‚而且åQ? ˜q™ç§å˜é‡åªèƒ½åœ¨JDK 1.5+ç‰ˆåŽæ‰èƒ½ä½¿ç”¨ã€?/p>
其五ã€å…³äºŽç‘ôæ‰Ñ€?/strong>是的åQŒç‘ô承于SingletonåŽçš„å类也有å¯èƒ½é€ æˆå¤šå®žä¾‹çš„问题。丘q‡ï¼Œå› äØ“æˆ‘ä»¬æ—©æŠŠSingletonçš„æž„é€ å‡½æ•°å£°æ˜Žæˆäº†ç§æœ‰çš„åQŒæ‰€ä»¥ä¹Ÿž®±æœ¾l了¾l§æ‰¿˜q™ç§äº‹æƒ…ã€?/p>
å…¶å…åQŒå…³äºŽä»£ç é‡ç”¨ã€?/strong>ä¹Ÿè¯æˆ‘们的系¾lŸä¸æœ‰å¾ˆå¤šä¸ª¾c»éœ€è¦ç”¨åˆ°è¿™ä¸ªæ¨¡å¼ï¼Œå¦‚果我们在æ¯ä¸€ä¸ªç±»éƒ½ä¸æœ‰è¿™æ ïLš„代ç åQŒé‚£ä¹? ž®±æ˜¾å¾—有点傻了。那么,我们是å¦å¯ä»¥ä½¿ç”¨ä¸€¿U方法,把这å…äh¨¡å¼æŠ½è±¡å‡ºåŽ»ï¼Ÿåœ¨C++下这是很å®ÒŽ˜“çš„ï¼Œå› äØ“æœ‰æ¨¡æ¿å’Œå‹å…ƒåQŒè¿˜æ”¯æŒæ ˆä¸Šåˆ†é…内å˜åQŒæ‰€ä»¥æ¯”较容易一 些(½E‹åºå¦‚下所½Cºï¼‰åQŒJava下å¯èƒ½æ¯”è¾ƒå¤æ‚ä¸€äº›ï¼Œèªæ˜Žçš„ä½ çŸ¥é“æ€Žä¹ˆåšå—åQ?/p>
(è½¬è²æ—¶è¯·æ³¨æ˜Žä½œè€…和出处。未¾l许å¯ï¼Œè¯·å‹¿ç”¨äºŽå•†ä¸šç”¨é€?/span>)
åQˆå…¨æ–‡å®ŒåQ?/p>
  预备知识åQ?/p>
  一ã€UML的特性与å‘展现状
  UML是一¿ULanguage(è¯è¨€)
  UML是一¿UModeling(建模)Language
  UML是Unified(¾lŸä¸€)Modeling Language
  1ã€å·²˜q›å…¥å…¨é¢åº”ç”¨é˜¶æ®µçš„äº‹å®žæ ‡å‡?/p>
  2ã€åº”用领域æ£åœ¨é€æ¸æ‰©å±•åQŒåŒ…括嵌入弾pÈ»Ÿå»ºæ¨¡ã€ä¸šåС徿¨¡ã€æµ½E‹å¾æ¨¡ç‰å¤šä¸ªé¢†åŸŸ
  3ã€æˆä¸?#8220;产生å¼ç¼–½E?#8221;çš„é‡è¦æ”¯æŒæŠ€æœ¯ï¼šMDAã€?坿‰§è¡ŒUML½{?/p>
  二ã€å¾æ¨¡çš„目的与原åˆ?/p>
  1ã€å¸®åŠ©æˆ‘ä»¬æŒ‰ç…§å®žé™…æƒ…å†‰|ˆ–按我们需è¦çš„æ ·å¼å¯¹ç³»¾lŸè¿›è¡Œå¯è§†åŒ–;æä¾›ä¸€¿U详¾l†è¯´æ˜Žç³»¾lŸçš„¾l“构或行为的æ–ÒŽ³•;¾l™å‡ºä¸€ä¸ªæŒ‡å¯¼ç³»¾lŸæž„é€ çš„æ¨¡æ¿;å¯ÒŽˆ‘们所åšå‡ºçš„决½{–进行文档化ã€?/p>
  2ã€ä»…å½“éœ€è¦æ¨¡åž‹æ—¶åQŒæ‰æž„å¾å®ƒã€?/p>
  3ã€é€‰æ‹©è¦åˆ›å»ÞZ»€ä¹ˆæ¨¡åž‹å¯¹å¦‚何动手解决问题和如何åÅžæˆè§£å†Ïx–¹æ¡ˆæœ‰ç€æ„义æ·Þp¿œçš„媄å“?æ¯ä¸€¿U模型å¯ä»¥åœ¨ä¸åŒçš„精度çñ”别上表示;最好的模型是与现实相蔾pÈš„;å•个模型是ä¸å……分的。对æ¯ä¸ªé‡è¦çš„ç³»¾lŸæœ€å¥½ç”¨ä¸€¾l„å‡ ä¹Žç‹¬ç«‹çš„æ¨¡åž‹åŽÕd¤„ç†ã€?/p>
  三ã€è°åº”该建模
  1ã€ä¸šåС徿¨¡ï¼šä»¥é¢†åŸŸä¸“å®¶äØ“ä¸»ï¼Œéœ€æ±‚åˆ†æžäh员是ä¸ÕdŠ›åQŒç³»¾lŸåˆ†æžå‘˜ã€æž¶æž„师å¯å‚ä¸?/p>
  2ã€éœ€æ±‚模型:以需求分æžähå‘˜äØ“ä¸»ï¼Œ¾pÈ»Ÿåˆ†æžå‘˜æ˜¯ä¸ÕdŠ›åQŒé¢†åŸŸä¸“å®¶æä¾›æŒ‡å¯û|¼Œæž¶æž„师和资深开å‘äh员å‚ä¸?/p>
  3ã€è®¾è®¡æ¨¡åž‹ï¼šé«˜å±‚设计模型以架构师ä¸ÞZ¸»åQŒç³»¾lŸåˆ†æžå‘˜ä»Žéœ€æ±‚æ–¹é¢æä¾›æ”¯æŒï¼Œèµ„深开å‘ähå‘˜ä»ŽæŠ€æœ¯å®žçŽ°æ–¹é¢æä¾›æ”¯æŒã€‚详¾l†è®¾è®¡æ¨¡åž‹åˆ™ä»¥èµ„深开å‘ähå‘˜äØ“ä¸»ï¼Œæž¶æž„å¸ˆæä¾›æŒ‡å¯¹{€?/p>
  4ã€å®žçŽ°æ¨¡åž‹ï¼šä»¥èµ„æ·±å¼€å‘ähå‘?设计人员)ä¸ÞZ¸»åQŒæž¶æž„师æä¾›æ€ÖM½“指导ã€?/p>
  5ã€?a class="fllink" target="_bank">æ•°æ®åº?/a>模型åQšä»¥æ•°æ®åº“å¼€å‘ähå‘˜äØ“ä¸»ï¼Œæž¶æž„å¸ˆæä¾›æŒ‡å¯û|¼Œèµ„深开å‘ähå‘?设计人员)予以é…åˆã€?/p>
  æ£å¼å¼€å§?/p>
  UML¾l„æˆåQŒä¸‰éƒ¨åˆ†(æž„é€ å—ã€è§„则ã€å…¬å…±æœºåˆ?åQŒå…³¾pÕd¦‚下图所½Cºï¼š
  
ã€€ã€€ä¸€ã€æž„é€ å—
  1ã€æž„é€ å—æ˜¯å¯¹æ¨¡åž‹ä¸æœ€å…ähœ‰ä»£è¡¨æ€§çš„æˆåˆ†çš„æŠ½è±?/p>
ã€€ã€€å»ºæ¨¡å…ƒç´ åQšUMLä¸çš„åè¯åQŒå®ƒæ˜¯æ¨¡åž‹åŸºæœ¬ç‰©ç†å…ƒç´ ã€?/p>
ã€€ã€€è¡ŒäØ“å…ƒç´ åQšUMLä¸çš„动è¯åQŒå®ƒæ˜¯æ¨¡åž‹ä¸çš„动æ€éƒ¨åˆ†ï¼Œæ˜¯ä¸€¿Uè·¨‘Šæ—¶é—´ã€ç©ºé—´çš„è¡ŒäØ“ã€?/p>
ã€€ã€€åˆ†ç»„å…ƒç´ åQšUMLä¸çš„容器åQŒç”¨æ¥ç»„¾l‡æ¨¡åž‹ï¼Œä½¿æ¨¡åž‹æ›´åŠ çš„¾l“构化ã€?/p>
ã€€ã€€æ³¨é‡Šå…ƒç´ åQšUMLä¸çš„解释部分åQŒå’Œä»£ç ä¸çš„æ³¨é‡Šè¯å¥ä¸€æ øP¼Œæ˜¯ç”¨æ¥æ˜q°æ¨¡åž‹çš„ã€?/p>
  1.1ã€å¾æ¨¡å…ƒç´?/p>
  ¾c?class)和对è±?object)
  接å£(interface)
  ä¸ÕdЍ¾c?active class)
  用例(use case)
  å作(collaboration)
  构äšg(component)
  节点(node)
  ¾c?class)和对è±?object)
  ¾cÀL˜¯å¯¹ä¸€¾l„具有相åŒå±žæ€§ã€ç›¸åŒæ“作ã€ç›¸åŒå…³¾pÕd’Œç›¸åŒè¯ä¹‰çš„对象的抽象
  UMLä¸ç±»æ˜¯ç”¨ä¸€ä¸ªçŸ©å½¢è¡¨½Cºçš„åQŒå®ƒåŒ…å«ä¸‰ä¸ªåŒºåŸŸåQŒæœ€ä¸Šé¢æ˜¯ç±»åã€ä¸é—´æ˜¯¾cÈš„å±žæ€§ã€æœ€ä¸‹é¢æ˜¯ç±»çš„æ–¹æ³?/p>
  对象则是¾cÈš„一个实ä¾?(object is a Instance of Class)
  接å£(interface)
ã€€ã€€æŽ¥å£æ˜¯æ˜q°æŸä¸ªç±»æˆ–构件的一个æœåŠ¡æ“作集
  ä¸ÕdЍ¾c?active class)
  ä¸ÕdЍ¾cÕd®žé™…上是一¿U特ŒDŠçš„¾c…R€‚å¼•ç”¨å®ƒçš„åŽŸå› ï¼Œå®žé™…ä¸Šæ˜¯åœ¨å¼€å‘ä¸éœ€è¦æœ‰ä¸€äº›ç±»èƒ½å¤Ÿèµ·åˆ° å¯åŠ¨æŽ§åˆ¶‹zÕdŠ¨çš„ä½œç”?/p>
  ä¸ÕdЍ¾cÀL˜¯æŒ‡å…¶å¯¹è±¡è‡›_°‘拥有一个进 ½E‹æˆ–¾U¿ç¨‹åQŒèƒ½å¤Ÿå¯åŠ¨æŽ§åˆ¶æ´»åŠ¨çš„¾c?/p>
  用例(use case)
  用例是著å的大师Ivar Jacobson首先æå‡ºçš„,现已¾læˆä¸ÞZº†é¢å‘对象软äšgå¼€å‘ä¸ä¸€ä¸ªéœ€æ±‚分æžçš„æœ€å¸¸ç”¨å·¥å…·
  用例实例是在¾pÈ»Ÿä¸æ‰§è¡Œçš„一¾pÕdˆ—动作åQŒè¿™äº›åŠ¨ä½œå°†ç”Ÿæˆç‰¹å®šæ‰§è¡Œè€…å¯è§çš„价值结果。一ä¸?用例定义一¾l„用例实例ã€?/p>
  å作(collaboration)
  å作定义了一个交互,它是ç”׃¸€¾l„å…±åŒå·¥ä½œä»¥æä¾›æŸåä½œè¡Œä¸ºçš„è§’è‰²å’Œå…¶ä»–å…ƒç´ æž„ æˆçš„一个群体ã€?/p>
  对于æŸä¸ªç”¨ä¾‹çš„实现就å?以表½CÞZؓ一个åä½?/p>
  构äšg(component)
  在实际的软äšg¾pÈ»Ÿä¸ï¼Œæœ‰è®¸å¤šè¦æ¯?#8220;¾c?#8221;更大的实体,例如一个COM¾l„äšgã€ä¸€ä¸ªDLLæ–‡äšgã€ä¸€ä¸ªJavaBeansã€ä¸€ä¸ªæ‰§è¡Œæ–‡ä»¶ç‰½{‰ã€‚äØ“äº†æ›´å¥½åœ°å¯¹åœ¨UML模型ä¸å¯¹å®ƒä»¬˜q›è¡Œè¡¨ç¤ºåQŒå°±å¼•入了构ä»?也译为组ä»?
  构äšg是系¾lŸè®¾è®¡çš„一个模å—化部分åQŒå®ƒéšè—了内部的实现åQŒå¯¹å¤–æä¾›äº†ä¸€¾l„外部接å£ã€‚在¾pÈ»Ÿä¸æ»¡‘³ç›¸åŒæŽ¥å£çš„¾l„äšgå¯ä»¥è‡ªç”±åœ°æ›¿æ?/p>
  节点(node)
  ä¸ÞZº†èƒ½å¤Ÿæœ‰æ•ˆåœ°å¯¹éƒ¨çÖvçš„ç»“æž„è¿›è¡Œå¾æ¨¡ï¼ŒUML引入了节点这一概念åQŒå®ƒå¯ä»¥ç”¨æ¥æè¿°å®žé™…çš„PCæœºã€æ‰“å°æœºã€?a class="fllink" target="_bank">æœåŠ¡å™?/a>½{‰èÊYä»¶è¿è¡Œçš„基础¼‹¬äšg
  节点是è¿è¡Œæ—¶å˜åœ¨çš„物ç†å…ƒç´ ,它表½CÞZº†ä¸€¿Uå¯è®¡ç®—的资æºï¼Œé€šå¸¸è‡›_°‘有å˜å‚¨ç©ºé—´å’Œå¤„ç†èƒ½åŠ›
  1.2ã€è¡Œä¸ºå…ƒç´?/p>
  交互(interaction)åQ?是在特定è¯å¢ƒä¸ï¼Œå…±åŒå®ŒæˆæŸä¸ªä»ÕdŠ¡çš„ä¸€¾l„对象之间交æ¢çš„ä¿¡æ¯é›†åˆ
  交互的表½Cºæ³•很简å•,ž®±æ˜¯ä¸€æ¡æœ‰å‘ç›´¾U¿ï¼Œòq¶åœ¨ä¸Šé¢æ ‡æœ‰æ“作å?/p>
ã€€ã€€çŠ¶æ€æœº(state machine)åQšæ˜¯ä¸€ä¸ªå¯¹è±¡æˆ–äº¤äº’åœ¨ç”Ÿå‘½å‘¨æœŸå†…å“应事äšg所¾l历的状æ€åºåˆ?/p>
  在UML模型ä¸å°†çжæ€ç”»ä¸ÞZ¸€ä¸ªåœ† 角矩形,òq¶åœ¨çŸ©åŞ内写出状æ€å ¿U°åŠå…¶å状æ€?/p>
  1.3ã€åˆ†¾l„å…ƒç´?/p>
  对于一个ä¸å¤§åž‹çš„èÊYä»¶ç³»¾lŸè€Œè¨€åQŒé€šå¸¸ä¼šåŒ…å«å¤§é‡çš„¾c»ï¼Œå› æ¤ä¹Ÿå°±ä¼šå˜åœ¨å¤§é‡çš„¾l“构事物ã€è¡Œä¸ÞZº‹ç‰©ï¼Œä¸ÞZº†èƒ½å¤Ÿæ›´åŠ æœ‰æ•ˆåœ°å¯¹å…¶è¿›è¡Œæ•´åˆï¼Œç”Ÿæˆæˆ–简或ç¹ã€æˆ–å®è§‚或微观的模型åQŒå°±éœ€è¦å¯¹å…¶è¿›è¡Œåˆ†¾l„。在UMLä¸ï¼Œæä¾›äº?#8220;åŒ?Package)”æ¥å®Œæˆè¿™ä¸€ç›®æ ‡
  1.4ã€æ³¨é‡Šå…ƒç´?/p>
  ¾l“æž„äº‹ç‰©æ˜¯æ¨¡åž‹çš„ä¸»è¦æž„é€ å—åQŒè¡Œä¸ÞZº‹ç‰©åˆ™æ˜¯è¡¥å……了模型ä¸çš„动æ€éƒ¨åˆ†ï¼Œåˆ†ç»„äº‹ç‰©è€Œæ˜¯ç”¨æ¥æ›´å¥½åœ°ç»„¾l‡æ¨¡åž‹ï¼Œä¼ég¹Žå·²ç»å¾ˆå®Œæ•´äº†ã€‚而注释事物则是用æ¥é”¦ä¸Šæ·»èŠÞqš„åQŒå®ƒæ˜¯ç”¨æ¥åœ¨UMLæ¨¡åž‹ä¸Šæ·»åŠ é€‚å½“çš„è§£é‡Šéƒ¨åˆ?/p>
  2ã€å…³¾p?/p>
  UML模型的关¾pÀL¯”较多,下图
  
  2.1 兌™”关系
  兌™”(Association)表示两个¾cÖM¹‹é—´å˜åœ¨æŸ¿Uè¯ä¹‰ä¸Šçš„蔾p…R€‚å…³è”å…³¾pÀL供了通信的èµ\径,它是所有关¾pÖM¸æœ€é€šç”¨ã€è¯ä¹‰æœ€å¼Þqš„ã€?/p>
  在UMLä¸ï¼Œä½¿ç”¨ä¸€æ¡å®ž¾U¿æ¥è¡¨ç¤ºå…Œ™”关系
  在关è”å…³¾pÖM¸åQŒæœ‰ä¸¤ç§æ¯”较ç‰ÒŽ®Šçš„å…³¾p»ï¼šèšåˆå’Œç»„å?/p>
  èšåˆå…³ç³»åQšèšå?Aggregation)是一¿U特ŒDŠåÅžå¼çš„å…Œ™”。èšåˆè¡¨½Cºç±»ä¹‹é—´çš„å…³¾pÀL˜¯æ•´ä½“与部分的关系
  如果å‘现“部分”¾cÈš„å˜åœ¨åQŒæ˜¯å®Œå…¨ä¾èµ–äº?#8220;整体”¾cÈš„åQŒé‚£ä¹ˆå°±åº”该使用“¾l„åˆ”å…³ç³»æ¥æ˜q?/p>
  ¾l„åˆæ˜¯èšåˆçš„å˜ç§åQŒåŠ å…¥äº†ä¸€äº›é‡è¦çš„è¯ä¹‰ã€‚也ž®±æ˜¯è¯ß_¼Œåœ¨ä¸€ä¸ªç»„åˆå…³¾pÖM¸ä¸€ä¸ªå¯¹è±¡ä¸€‹Æ¡å°±åªæ˜¯ä¸€ä¸ªç»„åˆçš„一部分åQ?#8220;整体”è´Ÿè´£“部分”çš„åˆ›å»ºå’Œç ´ååQŒå½““整体”è¢«ç ´åæ—¶åQ?#8220;部分”也éšä¹‹æ¶ˆå¤?/p>
  èšåˆž®±åƒæ±½èžRå’ŒèžR胎,汽èžRå了胎还å¯ä»¥ç”¨ã€‚组åˆå°±åƒå…¬å¸å’Œä¸‹å±žéƒ¨é—¨åQŒå…¬å¸å€’é—了部门也ž®×ƒ¸å˜åœ¨äº?
  2.2  泛化ã€å®žçŽîC¸Žä¾èµ–
  泛化关系æè¿°äº†ä¸€èˆ¬äº‹ç‰©ä¸Žè¯¥äº‹ç‰©ä¸çš„特ŒDŠç§¾cÖM¹‹é—´çš„关系åQŒä¹Ÿž®±æ˜¯çˆ¶ç±»ä¸Žå¾cÖM¹‹é—´çš„关系ã€?/p>
  实现关系是用æ¥è§„定接å£å’Œå®žçŽ°æŽ¥å£çš„ç±»æˆ–ç»„ä»¶ä¹‹é—´çš„å…³ç³»ã€‚æŽ¥å£æ˜¯æ“作的集åˆï¼Œ˜q™äº›æ“作用于规定¾cÀLˆ–¾l„äšgçš„æœåŠ¡ã€?/p>
ã€€ã€€æœ‰ä¸¤ä¸ªå…ƒç´ Xã€YåQŒå¦‚æžœä¿®æ”¹å…ƒç´ X的定义å¯èƒ½ä¼šå¼•è“v对å¦ä¸€ä¸ªå…ƒç´ Y的定义的修改åQŒåˆ™¿U°å…ƒç´ Yä¾èµ–(Dependency)äºŽå…ƒç´ Xã€?/p>
  二ã€è§„åˆ?/p>
  命ååQšä¹Ÿž®±æ˜¯ä¸ÞZº‹ç‰©ã€å…³¾pÕd’Œå›¾è“våå—。和ä»ÖM½•è¯è¨€ä¸€æ øP¼Œåå—éƒ½æ˜¯ä¸€ä¸ªæ ‡è¯†ç¬¦
  范围åQšä¸Ž¾cÈš„作用域相ä¼?
  å¯è§æ€§ï¼šPublicåQŒProtectedåQŒPrivateåQŒPackage
  三ã€UML公共机制
  1ã€è§„æ ¼æ˜q?/p>
  在图形表½Cºæ³•çš„æ¯ä¸ªéƒ¨åˆ†åŽé¢éƒ½æœ‰ä¸€ä¸ªè§„æ ¼æ˜q?ä¹Ÿç§°ä¸ø™¯¦˜q?åQŒå®ƒç”¨æ¥å¯ÒŽž„é€ å—çš„è¯æ³•å’Œè¯ä¹‰˜q›è¡Œæ–‡å—å™è¿°ã€‚è¿™¿Uæž„æ€ï¼Œä¹Ÿå°±ä½¿å¯è§†åŒ–视图和文å—视囄¡š„分离 åQ?/p>
  2ã€UML修饰与通用划分
ã€€ã€€åœ¨äØ“äº†æ›´å¥½çš„è¡¨ç¤º˜q™äº›¾l†èŠ‚åQŒUMLä¸è¿˜æä¾›äº†ä¸€äº›ä¿®é¥°ç¬¦åøP¼Œä¾‹å¦‚ä¸åŒå¯è§†æ€§çš„½W¦å·ã€ç”¨æ–œä½“å—表½CºæŠ½è±¡ç±»
  UML通用划分åQ?/p>
  1)¾cÖM¸Žå¯¹è±¡çš„划分:¾cÀL˜¯ä¸€¿U抽象,对象是一个具ä½?的实ä¾?/p>
  2)接å£ä¸Žå®žçŽ°çš„åˆ†ç¦»åQšæŽ¥å£æ˜¯ä¸€¿Uå£°æ˜Žã€æ˜¯ä¸€ä¸ªå¥‘ ¾U¦ï¼Œä¹Ÿæ˜¯æœåŠ¡çš„å…¥å?å®žçŽ°åˆ™æ˜¯è´Ÿè´£å®žæ–½æŽ¥å£æä¾› 的契¾U?/p>
  3ã€UML扩展机制
  ˜q™éƒ¨åˆ†ä¸å®ÒŽ˜“æè¿°åQŒå¾…æ”?邀月注 2009.2.18)
ã€€ã€€æž„é€ åž‹åQšåœ¨å®žé™…çš„å¾æ¨¡è¿‡½E‹ä¸åQŒå¯èƒ½ä¼šéœ€è¦å®šä¹‰ä¸€äº›ç‰¹å®šäºŽæŸä¸ªé¢†åŸŸæˆ–æŸä¸ªç³»¾lŸçš„æž„é€ å—
ã€€ã€€æ ‡è®°å€¼åˆ™æ˜¯ç”¨æ¥äؓ事物æ·ÕdŠ æ–°ç‰¹æ€§çš„ã€‚æ ‡è®°å€¼çš„è¡¨ç¤ºæ–ÒŽ³•是用形如“{æ ‡è®°ä¿¡æ¯}”的嗽W¦ä¸²
  ¾U¦æŸæ˜¯ç”¨æ¥å¢žåŠ æ–°çš„è¯ä¹‰æˆ–改å˜å·²å˜åœ¨è§„则的一¿U机åˆ?自由文本和OCL两ç§è¡¨ç¤ºæ³?。约æŸçš„è¡¨ç¤ºæ³•å’Œæ ‡è®°å€¼æ³•¾cÖM¼¼åQŒéƒ½æ˜¯ä‹Éç”¨èŠ±æ‹¬å·æ‹¬è“væ¥çš„串æ¥è¡¨ç¤ºåQŒä¸˜q‡å®ƒæ˜¯ä¸èƒ½å¤Ÿæ”‘Öœ¨å…ƒç´ ä¸çš„åQŒè€Œæ˜¯æ”‘Öœ¨ç›¸å…³çš„å…ƒç´ é™„˜q‘ã€?/p>
  4ã€UML视图和图
  
  囑Ö            功能                备注
  ¾cÕd›¾ã€€ã€€ã€€ã€€ã€€ã€€æè¿°¾c…R€ç±»çš„特性以åŠç±»ä¹‹é—´çš„å…³¾p…R€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€UML 1原有
  对象图     æè¿°ä¸€ä¸ªæ—¶é—´ç‚¹ä¸Šç³»¾lŸä¸å„个对象的一个快ç…?   UML 1éžæ£å¼å›¾
  å¤åˆ¾l“构图   æè¿°¾cÈš„˜q行时刻的分解             UML 2.0新增
  构äšg图     æè¿°æž„äšg的结构与˜qžæŽ¥ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€UML 1原有
  部çÖv图     æè¿°åœ¨å„个节点上的部¾|ŒÓ€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€UML 1原有
  包图      æè¿°¾~–译时的层次¾l“构              UMLä¸éžæ£å¼å›?/p>
  用例图     æè¿°ç”¨æˆ·ä¸Žç³»¾lŸå¦‚何交互             UML 1原有
  ‹zÕdŠ¨å›¾ã€€ã€€ã€€ã€€ã€€æè¿°˜q‡ç¨‹è¡ŒäØ“ä¸ŽåÆˆè¡Œè¡Œä¸ºã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€UML 1原有
ã€€ã€€çŠ¶æ€æœºå›¾ã€€ã€€ã€€ã€€æè¿°äº‹äšg如何改å˜å¯¹è±¡ç”Ÿå‘½å‘¨æœŸã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€UML 1原有
  ™åºåºå›¾ã€€ã€€ã€€ã€€ã€€æè¿°å¯¹è±¡ä¹‹é—´çš„交互,é‡ç‚¹åœ¨å¼ºè°ƒé¡ºåºã€€ã€€ã€€ã€€ã€€ã€€ã€€UML 1原有
  通信图     æè¿°å¯¹è±¡ä¹‹é—´çš„交互,é‡ç‚¹åœ¨äºŽ˜qžæŽ¥ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€UML 1ä¸çš„å作å›?/p>
  定时图     æè¿°å¯¹è±¡ä¹‹é—´çš„交互,é‡ç‚¹åœ¨äºŽå®šæ—¶ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€UML 2.0 新增
  交互概观图   是一¿U顺åºå›¾ä¸Žæ´»åŠ¨å›¾çš„æØœåˆã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€ã€€UML 2.0新增
  附:开å‘过½E‹ä¸Žå›„¡š„对应关系
  
目录 åQ?br />
UML视图和图
一 åQšé™æ€è§†å›?
陿€è§†å›?的主è¦ç»„æˆéƒ¨åˆ†æ˜¯ ¾cÕd’Œå…³ç³» åQŒå®ƒæ˜„¡¤ºä¸ºç±»å›?å› äØ“å®ƒä¸æè¿°æ—‰™—´ç›¸å…³çš„è¡Œä¸ºï¼Œå› è€Œæ˜¯é™æ€çš„åQ?关系包括 åQšå…³è”,¾l§æ‰¿ 和儿Uä¾èµ–,ä¾èµ–包括实现和ä‹É用。类间的关系¾l˜æˆ˜qžæŽ¥¾cÈš„路径åQŒä¸åŒç§¾cÈš„关系ç”Þqº¿ä¸Šçš„¾l“构和èµ\å¾?或端点上的修饰æ¥åŒºåˆ†ã€?br />
例å åQ?br />
¼œ¨æˆ¿åº”用的类å›?br />
图例 åQ?br />
äº?åQšç”¨ä¾‹å›¾
ç”¨ä¾‹ä½œäØ“äº¤äº’è§†å›¾ä¸çš„å作æ¥å®žçŽ°çš„ã€?主è¦ä»Žæ´»åŠ¨è€…çš„è§’åº¦è€ƒè™‘ã€?br />
ä¸?åQ?交互视图
1 åQšé¡ºåºå›¾
2 åQšå作图
å›?åQšçŠ¶æ€æœºè§†å›¾
çŠ¶æ€æœºæ˜„¡¤ºä¸ºçжæ€å›¾
äº?åQšæ´»åŠ¨è§†å›?br />
横æ¡è¡¨ç¤ºæŽ§åˆ¶çš„åˆ†å‰æ²³˜qžæŽ¥
å…?åQšç‰©ç†è§†å›?
有两¿U物ç†è§†å›?åQšå®žçŽ°è§†å›?å’?é…置视图
1 åQšå®žçŽ°è§†å›?
实现视图昄¡¤ºä¸ºæž„件图
æŽ¥å£æ˜„¡¤ºä¸ºå…·æœ‰å“¦å称的圆åQŒå³ç›¸å…³çš„æœåŠ¡é›† åQŒè¿žæŽ¥æž„件和接å£çš„实¾U¿è¡¨½Cºæž„ä»¶æä¾›æŽ¥å£æ‰€åˆ—ä‹Dçš„æœåŠ¡ã€‚ä»Žæž„äšgè‡ÏxŽ¥å£çš„虚线表明构äšgéœ€è¦æŽ¥å£æ‰€æä¾›çš„æœåŠ?br />
2 åQšé…¾|®è§†å›?
é…置视图表达了è¿è¡Œæ—¶æ–?æž„äšg实力在结点实例ä¸çš„分布,¾l“点是è¿è¡Œèµ„æºï¼Œå¦‚计½Ž—机åQŒè®¾å¤‡æˆ–内å˜åQŒè¯¥è§†å›¾å…许分布å¼çš„¾l“果和资æºåˆ†é…被评估åQŒä¸‹é¢å›¾ä¸å±•½CÞZº†¾pÈ»Ÿä¸ç»“点的¿U类和结ç‚ÒŽ‰€æ‹¥æœ‰æž„äšg的秾c»ï¼ŒèŠ‚ç”µæ˜„¡¤ºä¸ºæ–¹å—ã€?br />
下图 æ˜?一个实例çñ”别的é…ç½®å›?
ä¸?åQšæ¨¡åž‹ç®¡ç†è§†å›?
最å?æ¥å‡ å¼ å›¾
¾cÕd›¾ä¸çš„关系 åQ?br />
1 åQšä¸€èˆ¬åŒ–åQˆGeneralization åQ‰å…³¾p?
2 åQšå…³è? Association )关系
2.1 : èšåˆåQˆAggregation )关系
2.2 : åˆæˆ(Composition)关系
3 : ä¾èµ– ( Dependency )关系
|
![]() |
¾U§åˆ«åQ?åˆçñ” 傅纯一, Rationalä¸å›½åŒºæŠ€æœ¯é”€å”®ç»ç? IBMä¸å›½æœ‰é™å…¬å¸è½¯äšgéƒ?br /> 2004 òq?11 æœ?01 æ—?/p> 用例(Use Case)是一¿Uæ˜q°ç³»¾lŸéœ€æ±‚çš„æ–ÒŽ³•åQŒä‹É用用例的æ–ÒŽ³•æ¥æ˜q°ç³»¾lŸéœ€æ±‚çš„˜q‡ç¨‹ž®±æ˜¯ç”¨ä¾‹å»ºæ¨¡ã€‚用例方法最早是由Iva Jackbosonåšå£«æå‡ºçš„ï¼ŒåŽæ¥è¢«ç»¼åˆåˆ°UML规范之ä¸åQŒæˆä¸ÞZ¸€¿Uæ ‡å‡†åŒ–çš„éœ€æ±‚è¡¨˜qîC½“¾p…R€‚用例的使用在RUPä¸è¢«æŽ¨å´‡å¤‡è‡³åQŒæ•´ä¸ªRUP‹¹ç¨‹éƒ½è¢«¿UîC½œæ˜?用例驱动"(Use-Case Driven)的,å„ç§¾cÕdž‹çš„开呿´»åŠ¨åŒ…æ‹¬é¡¹ç›®ç®¡ç†ã€åˆ†æžè®¾è®¡ã€æµ‹è¯•ã€å®žçްç‰éƒ½æ˜¯ä»¥ç³»¾lŸç”¨ä¾‹äؓ主è¦è¾“入工äšgåQŒç”¨ä¾‹æ¨¡åž‹å¥ 定了整个¾pÈ»Ÿè½¯äšgå¼€å‘的基础ã€?/blockquote> |
原型模å¼å®šä¹‰:
用原型实例指定创建对象的¿Uç±»,òq¶ä¸”通过拯‚´˜q™äº›åŽŸåž‹åˆ›å¾æ–°çš„对象.
Prototype模å¼å…许一个对象å†åˆ›å¾å¦å¤–一个å¯å®šåˆ¶çš„对象,æ ÒŽœ¬æ— 需知é“ä»ÖM½•如何创å¾çš„细èŠ?å·¥ä½œåŽŸç†æ˜?通过ž®†ä¸€ä¸ªåŽŸåž‹å¯¹è±¡ä¼ ¾l™é‚£ä¸ªè¦å‘动创å¾çš„对象,˜q™ä¸ªè¦å‘动创建的对象通过è¯äh±‚原型对象拯‚´å®ƒä»¬è‡ªå·±æ¥å®žæ–½åˆ›å»ºã€?/p>
如何使用?
å› äØ“Javaä¸çš„æä¾›clone()æ–ÒŽ³•æ¥å®žçŽ°å¯¹è±¡çš„å…‹éš†,所以Prototype模å¼å®žçް䏀䏋åå˜å¾—很简å?
以勺åäØ“ä¾‹ï¼š
public abstract class AbstractSpoon implements Cloneable {   String spoonName;   public void setSpoonName(String spoonName) {this.spoonName = spoonName;}   public String getSpoonName() {return this.spoonName;}   public Object clone()   {     Object object = null;     try {       object = super.clone();     } catch (CloneNotSupportedException exception) {       System.err.println("AbstractSpoon is not Cloneable");     }     return object;   } } |
有个具体实现(ConcretePrototype):
public class SoupSpoon extends AbstractSpoon
|
调用Prototype模å¼å¾ˆç®€å?
AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = spoon.clone();
当然也å¯ä»¥ç»“åˆå·¥åŽ‚æ¨¡å¼æ¥åˆ›å¾AbstractSpoon实例ã€?/p>
在Javaä¸Prototype模å¼å˜æˆclone()æ–ÒŽ³•çš„ä‹É用,ç”׃ºŽJava的纯‹zçš„é¢å‘对象ç‰ÒŽ€§ï¼Œä½¿å¾—在Javaä¸ä‹É用设计模å¼å˜å¾—很自然åQŒä¸¤è€…å·²¾lå‡ ä¹Žæ˜¯‹¹‘ç„¶ä¸€ä½“äº†ã€‚è¿™åæ˜ 在很多模å¼ä¸ŠåQŒå¦‚Interatoré历模å¼ã€?/p>
Templateæ¨¡æ¿æ¨¡å¼å®šä¹‰:
定义一个æ“ä½œä¸½Ž—æ³•çš„éª¨æž?ž®†ä¸€äº›æ¥éª¤çš„æ‰§è¡Œå»¶è¿Ÿåˆ°å…¶åç±»ä¸?
使用Java的抽象类æ—Óž¼Œž®Þq»å¸æ€¼šä½¿ç”¨åˆ°Template模å¼,å› æ¤Template模å¼ä½¿ç”¨å¾ˆæ™®é?而且很容易ç†è§£å’Œä½¿ç”¨ã€?/p>
public abstract class Benchmark {   /**   * 䏋颿“作是我们希望在åç±»ä¸å®Œæˆ?br />   */   public abstract void benchmark();   /**     for (int i = 0; i < count; i++) |
在上例ä¸,我们希望é‡å¤æ‰§è¡Œbenchmark()æ“作,但是对benchmark()的具体内å®Ò޲¡æœ‰è¯´æ˜?而是延迟到其åç±»ä¸æ˜q?
public class MethodBenchmark extends Benchmark {   /**   * 真æ£å®šä¹‰benchmark内容   */   public void benchmark() {     for (int i = 0; i < Integer.MAX_VALUE; i++){       System.out.printtln("i="+i);         }   } } |
è‡Ïx¤,Template模å¼å·²ç»å®Œæˆ,æ˜¯ä¸æ˜¯å¾ˆ½Ž€å?
我们¿U°repeatæ–ÒŽ³•ä¸ºæ¨¡æ¿æ–¹æ³•, 它其ä¸çš„benchmark()实现被åšg˜qŸåˆ°åç±»MethodBenchmarkä¸å®žçŽîCº†åQ?/p>
看看如何使用:
Benchmark operation = new MethodBenchmark();
long duration = operation.repeat(Integer.parseInt(args[0].trim()));
System.out.println("The operation took " + duration + " milliseconds");
ä¹Ÿè®¸ä½ ä»¥å‰è¿˜ç–‘惑抽象¾cÀLœ‰ä»€ä¹ˆç”¨,çŽ°åœ¨ä½ åº”è¯¥å½»åº•æ˜Žç™½äº†å? 至于˜q™æ ·åšçš„好处,很显然啊,扩展性强,以åŽBenchmark内容å˜åŒ–,我åªè¦å†åšä¸€ä¸ªç‘ô承å¾cÕd°±å¯ä»¥,ä¸å¿…修改其他应用代ç .