﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Jerome Kwok-文章分类-设计模式</title><link>http://www.blogjava.net/JeromeKwok/category/40525.html</link><description>仁者不忧，知者不惑，勇者不惧</description><language>zh-cn</language><lastBuildDate>Tue, 14 Jul 2009 19:12:10 GMT</lastBuildDate><pubDate>Tue, 14 Jul 2009 19:12:10 GMT</pubDate><ttl>60</ttl><item><title>模式之---访问者模式（Visitor Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285363.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Fri, 03 Jul 2009 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285363.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285363.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-03 16:04 <a href="http://www.blogjava.net/JeromeKwok/articles/285363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---解释器模式（Interpreter Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285353.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Fri, 03 Jul 2009 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285353.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285353.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-03 15:00 <a href="http://www.blogjava.net/JeromeKwok/articles/285353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---享元模式（FlyWeight Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285320.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Fri, 03 Jul 2009 04:10:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285320.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285320.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-03 12:10 <a href="http://www.blogjava.net/JeromeKwok/articles/285320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---中介者模式（Mediator Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285315.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Fri, 03 Jul 2009 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285315.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285315.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-03 11:36 <a href="http://www.blogjava.net/JeromeKwok/articles/285315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---职责链模式（Chain of Responsibility）</title><link>http://www.blogjava.net/JeromeKwok/articles/285307.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Fri, 03 Jul 2009 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285307.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285307.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-03 11:06 <a href="http://www.blogjava.net/JeromeKwok/articles/285307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---命令模式（Command Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285291.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Fri, 03 Jul 2009 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285291.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285291.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-03 10:09 <a href="http://www.blogjava.net/JeromeKwok/articles/285291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---桥接模式（Bridge Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285217.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Thu, 02 Jul 2009 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285217.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285217.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-02 17:12 <a href="http://www.blogjava.net/JeromeKwok/articles/285217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---单例模式（Singleton Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285206.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Thu, 02 Jul 2009 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285206.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285206.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-02 16:33 <a href="http://www.blogjava.net/JeromeKwok/articles/285206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---迭代器模式（Iterator Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285183.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Thu, 02 Jul 2009 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285183.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285183.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-02 15:04 <a href="http://www.blogjava.net/JeromeKwok/articles/285183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---组合模式（Composite Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285126.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Thu, 02 Jul 2009 04:01:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285126.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285126.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-02 12:01 <a href="http://www.blogjava.net/JeromeKwok/articles/285126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---备忘录模式（Memento Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285105.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Thu, 02 Jul 2009 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285105.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285105.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-02 10:42 <a href="http://www.blogjava.net/JeromeKwok/articles/285105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---适配器模式（Adapter Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/285059.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Thu, 02 Jul 2009 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/285059.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/285059.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/285059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-02 09:21 <a href="http://www.blogjava.net/JeromeKwok/articles/285059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---状态模式（State Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/284986.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Wed, 01 Jul 2009 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284986.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/284986.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/284986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-01 17:32 <a href="http://www.blogjava.net/JeromeKwok/articles/284986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---观察者模式（Observer Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/284912.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Wed, 01 Jul 2009 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284912.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/284912.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/284912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-01 12:03 <a href="http://www.blogjava.net/JeromeKwok/articles/284912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---建造者模式（Builder Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/284892.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Wed, 01 Jul 2009 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284892.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/284892.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/284892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-01 10:34 <a href="http://www.blogjava.net/JeromeKwok/articles/284892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---外观模式（Façade pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/284875.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Wed, 01 Jul 2009 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284875.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/284875.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/284875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-01 09:23 <a href="http://www.blogjava.net/JeromeKwok/articles/284875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---模板方法模式（Template Method Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/284863.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Wed, 01 Jul 2009 00:18:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284863.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/JeromeKwok/articles/284863.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/284863.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-07-01 08:18 <a href="http://www.blogjava.net/JeromeKwok/articles/284863.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---原型模式（Prototype Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/284745.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Tue, 30 Jun 2009 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284745.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/284745.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/284745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/284745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/284745.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 定义：用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.Prototype模式允许一个对象再创建另外一个可定制的对象，根本无需知道任何如何创建的细节,工作原理:通过将一个原型对象传给那个要发动创建的对象，这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 适用性：当要实例化的类是在运行时刻指定时，例如，...&nbsp;&nbsp;<a href='http://www.blogjava.net/JeromeKwok/articles/284745.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/284745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-06-30 11:59 <a href="http://www.blogjava.net/JeromeKwok/articles/284745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---代理模式（Proxy Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/284730.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Tue, 30 Jun 2009 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284730.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/284730.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/284730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/284730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/284730.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.代理模式 代理模式的作用是：为其他对象提供一种代理以控制对这个对象的访问。在某些情况下，一个客户不想或者不能直接引用另一个对象，而代理对象可以在客户端和目标对象之间起到中介的作用。 代理模式一般涉及到的角色有： 抽象角色：声明真实对象和代理对象的共同接口； 代理角色：代理对象角色内部含有对真实对象的引用，从而可以操作真实对象，同时代理对象提供与真实对象相同的接口...&nbsp;&nbsp;<a href='http://www.blogjava.net/JeromeKwok/articles/284730.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/284730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-06-30 10:39 <a href="http://www.blogjava.net/JeromeKwok/articles/284730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---装饰模式（Decoratory Pattern ）</title><link>http://www.blogjava.net/JeromeKwok/articles/284615.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Mon, 29 Jun 2009 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284615.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/284615.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/284615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/284615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/284615.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一例：装饰模式是对对象功能增强时，平时使用继承的一种替代方案一．UML示意图：二．组成部分：1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 抽象构件：原始的功能接口2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 具体构件：具体的原始功能类3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/JeromeKwok/articles/284615.html'>阅读全文</a><img src ="http://www.blogjava.net/JeromeKwok/aggbug/284615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-06-29 15:43 <a href="http://www.blogjava.net/JeromeKwok/articles/284615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---策略模式（Strategy Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/284570.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Mon, 29 Jun 2009 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284570.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/284570.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/284570.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/284570.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/284570.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt"><span style="font-family: Courier">策略模式是对算法的包装，把使用算法的责任和算法本身分隔开，委派给不同的对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面，作为一个抽象策略类的子类。</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">何时使用策略模式：</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">1）&nbsp; 如果在一个系统里面有许多类，它们之间的区别仅在于它们的行为，那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">2）&nbsp; 如果系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面，而这些算法类都是一个抽象算法类的子类。换言之，这些具&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 体&nbsp;&nbsp;&nbsp;&nbsp; 算法类均有统一的接口，由于多态性原则。客户端可以选择使用任何一个具体算法类，并只持有一个数据类型是抽象算法类的对象。</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">3）&nbsp; 一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复发的和只与算法有关的数据。</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">4）&nbsp; 假设这样一个案例：假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。如果要计算购物车的货品的价格，一个最简单的情况就是把所有货品的单价乘上数量，但是实际情况肯定比这要复杂。比如，教材类图书每本一元折扣，连环画类图书每本7%的折扣，非教材类计算机图书3%折扣，其余没有折扣。这个价格计算问题就可以由策略模式来解决。</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">类图：</span></span></p>
<p><font style="background-color: #ebf5f0"></font><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="font-family: Courier"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/surprisesdu/Strategy.jpg" /></span></span></span></strong></p>
<font style="background-color: #ebf5f0">
<p><br />
<span style="font-size: 10pt"><span style="font-family: Courier">源代码：</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">public class Context {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Strategy stg;</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Context(Strategy theStg)</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.stg = theStg;</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; public void DoAction()</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.stg.AlgrithmInterface();</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">}</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">public class ConcreteStrategyA implements Strategy {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; public void AlgrithmInterface()</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("ConcreteStrategyA.AlgrithmInterface");</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">}</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">public class ConcreteStrategyB implements Strategy {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; public void AlgrithmInterface()</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("ConcreteStrategyB.AlgrithmInterface");</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">}</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">public class Context {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Strategy stg;</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Context(Strategy theStg)</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.stg = theStg;</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; public void DoAction()</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.stg.AlgrithmInterface();</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">}</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">public class Client {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Strategy stgA = new ConcreteStrategyA();</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Context ct = new Context(stgA);</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ct.DoAction();</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><br />
<span style="font-size: 10pt"><span style="font-family: Courier">}</span></span></p>
<p><br />
<span style="font-size: 10pt"><span style="font-family: Courier">策略模式的缺点：</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">1）&nbsp; 客户端必须知道所有的策略类，并自行决定使用哪一个策略类，这就意味着客户端必须</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">理解这些算法的区别，以便适时选择恰当的算法类。换言之，策略模式只适用于客户端知道所有的算法或行为的情况。</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">2）策略模式造成许多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面，而将策略类设计成可共享的，这样策略类实例可以被不同客户端使用。换言之，可以使用享元模式来减少对象的数量。</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/surprisesdu/archive/2006/03/24/636951.aspx</span></span></font></p>
<img src ="http://www.blogjava.net/JeromeKwok/aggbug/284570.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-06-29 11:40 <a href="http://www.blogjava.net/JeromeKwok/articles/284570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式之---工厂模式（Factory Pattern）</title><link>http://www.blogjava.net/JeromeKwok/articles/284566.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Mon, 29 Jun 2009 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284566.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/284566.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/284566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/284566.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/284566.html</trackback:ping><description><![CDATA[<p style="line-height: 150%"><span style="font-size: 10pt; line-height: 150%; font-family: Courier">一、引子<span lang="EN-US"><br />
</span><span style="font-size: 10pt">话说十年前，有一个爆发户，他家有三辆汽车（<span lang="EN-US" style="font-size: 10pt">Benz</span>（奔驰）、<span lang="EN-US" style="font-size: 10pt">Bmw</span>（宝马）、<span lang="EN-US" style="font-size: 10pt">Audi</span>（奥迪）看来这人比较爱国，没有日本车），还雇了司机为他开车。不过，爆发户坐车时总是这样：上<span lang="EN-US" style="font-size: 10pt">Benz</span>车后跟司机说<span lang="EN-US" style="font-size: 10pt">"</span>开奔驰车！<span lang="EN-US" style="font-size: 10pt">"</span>，坐上<span lang="EN-US" style="font-size: 10pt">Bmw</span>后他说<span lang="EN-US" style="font-size: 10pt">"</span>开宝马车！<span lang="EN-US" style="font-size: 10pt">"</span>，坐上<span lang="EN-US" style="font-size: 10pt">Audi</span>后他说<span lang="EN-US" style="font-size: 10pt">"</span>开奥迪车！<span lang="EN-US" style="font-size: 10pt">"</span>。</span><span style="font-size: 10pt">你一定说：这人有病！直接说开车不就行了？！ </span><span style="font-size: 10pt">而当把这个爆发户的行为放到我们程序语言中来，我们发现<span lang="EN-US" style="font-size: 10pt">C</span>语言一直是通过这种方式来坐车的！</span><span style="font-size: 10pt">幸运的是，这种有病的现象在<span lang="EN-US" style="font-size: 10pt">OO</span>语言中可以避免了。下面以<span lang="EN-US" style="font-size: 10pt">Java</span>语言为基础来引入我们本文的主题：工厂模式！！<br />
<span lang="EN-US" style="font-size: 10pt"><o:p><span style="font-size: 10pt; line-height: 150%"><br />
二、简介<span lang="EN-US" style="font-size: 10pt"><br />
</span>工厂模式主要是为创建对象提供了接口。工厂模式按照《<span lang="EN-US" style="font-size: 10pt">Java</span>与模式》中的提法分为三类：<span lang="EN-US" style="font-size: 10pt"><br />
1. </span>简单工厂模式<span lang="EN-US" style="font-size: 10pt">(Simple Factory) <br />
2. </span>工厂方法模式<span lang="EN-US" style="font-size: 10pt">(Factory Method) <br />
3. </span>抽象工厂模式<span lang="EN-US" style="font-size: 10pt">(Abstract Factory) <br />
</span>这三种模式从上到下逐步抽象，并且更具一般性。还有一种分类法，就是将简单工厂模式看为工厂方法模式的一种特例，两个归为一类。下面是使用工厂模式的两种情况：<span lang="EN-US" style="font-size: 10pt"><br />
1.</span>在编码时不能预见需要创建哪种类的实例。<span lang="EN-US" style="font-size: 10pt"><br />
2.</span>系统不应依赖于产品类实例如何被创建、组合和表达的细节<br />
</span><span style="font-size: 10pt; line-height: 150%"><br />
三、简单工厂模式<span lang="EN-US" style="font-size: 10pt"><br />
</span>顾名思义，这个模式本身很简单，而且使用在业务较简单的情况下。<span lang="EN-US" style="font-size: 10pt"><br />
</span>它由三种角色组成（关系见下面的类图）：<span lang="EN-US" style="font-size: 10pt"><br />
</span>1、工厂类角色：这是本模式的核心，含有一定的商业逻辑和判断逻辑。在<span lang="EN-US" style="font-size: 10pt">java</span>中它往往由一个具体类实现。<br />
</span><span style="font-size: 10pt; line-height: 150%">2、抽象产品角色：它一般是具体产品继承的父类或者实现的接口。在<span lang="EN-US" style="font-size: 10pt">java</span>中由接口或者抽象类来实现。<br />
</span><span style="font-size: 10pt; line-height: 150%">3、具体产品角色：工厂类所创建的对象就是此角色的实例。在<span lang="EN-US" style="font-size: 10pt">java</span>中由一个具体类实现。<span lang="EN-US" style="font-size: 10pt"><span lang="EN-US" style="font-size: 10pt"><br />
</span><span lang="EN-US" style="font-size: 10pt; line-height: 150%"><img onmousewheel="return bbimg(this)" style="cursor: pointer; zoom: 100%" onclick="javascript:window.open(this.src);" height="209" src="http://blog.csai.cn/UploadFiles/2009-2/26825231.jpg" width="500" onload="rsimg(this,500)" resized="true"  alt="" /></span><span lang="EN-US" style="font-size: 10pt; line-height: 150%"><br />
<span style="font-size: 10pt; line-height: 150%">那么简单工厂模式怎么用呢？我来举个例子吧，我想这个比讲一大段理论上的文字描述要容易理解的多！下面就来给那个暴发户治病<span lang="EN-US" style="font-size: 10pt">: P <br />
</span>在使用了简单工厂模式后，现在暴发户只需要坐在车里对司机说句：<span lang="EN-US" style="font-size: 10pt">"</span>开车<span lang="EN-US" style="font-size: 10pt">"</span>就可以了。来看看怎么实现的：<span lang="EN-US" style="font-size: 10pt"><br />
//</span>抽象产品角色<span lang="EN-US" style="font-size: 10pt"> <br />
public interface Car{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void drive(); <br />
}<o:p></o:p></span></span> </p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%">//</span><span style="font-size: 10pt; line-height: 150%">具体产品角色<span lang="EN-US" style="font-size: 10pt"> <br />
public class Benz implements Car{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void drive() {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Driving Benz ");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
}<o:p></o:p></span></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%">public class Bmw implements Car{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void drive() {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Driving Bmw ");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
} <br />
</span><span style="font-size: 10pt; line-height: 150%">。。。（奥迪我就不写了<span lang="EN-US" style="font-size: 10pt">:P</span>）<span lang="EN-US" style="font-size: 10pt"><o:p></o:p></span></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%">//</span><span style="font-size: 10pt; line-height: 150%">工厂类角色<span lang="EN-US" style="font-size: 10pt"> <br />
public class Driver{<o:p></o:p></span></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%">//</span><span style="font-size: 10pt; line-height: 150%">工厂方法<span lang="EN-US" style="font-size: 10pt"><br />
//</span>注意 返回类型为抽象产品角色<span lang="EN-US" style="font-size: 10pt"> <br />
public static Car driverCar(String s)throws Exception {<o:p></o:p></span></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span style="font-size: 10pt; line-height: 150%">判断逻辑，返回具体的产品角色给<span lang="EN-US" style="font-size: 10pt">Client&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(s.equalsIgnoreCase("Benz"))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new Benz();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(s.equalsIgnoreCase("Bmw"))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new Bmw();<o:p></o:p></span></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%">...... <br />
else throw new Exception(); <br />
</span><span style="font-size: 10pt; line-height: 150%">。。。<br />
</span><span lang="EN-US" style="font-size: 10pt; line-height: 150%">//</span><span style="font-size: 10pt; line-height: 150%">欢迎暴发户出场<span lang="EN-US" style="font-size: 10pt">...... <br />
public class Magnate{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span>告诉司机我今天坐奔驰<span lang="EN-US" style="font-size: 10pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Car car = Driver.driverCar("benz");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span>下命令：开车<span lang="EN-US" style="font-size: 10pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;car.drive();&nbsp;<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;。。。<span lang="EN-US" style="font-size: 10pt"><br />
</span>如果将所有的类放在一个文件中，请不要忘记只能有一个类被声明为<span lang="EN-US" style="font-size: 10pt">public</span>。</span> 程序中类之间的关系如下：<img onmousewheel="return bbimg(this)" style="cursor: pointer; zoom: 100%" onclick="javascript:window.open(this.src);" height="205" src="http://blog.csai.cn/UploadFiles/2009-2/26294976.jpg" width="500" onload="rsimg(this,500)" resized="true"  alt="" /><br />
<span style="font-size: 10pt; line-height: 150%">这便是简单工厂模式了。下面是其好处：<br />
</span><span style="font-size: 10pt; line-height: 150%">首先，使用了简单工厂模式后，我们的程序不在<span lang="EN-US" style="font-size: 10pt">"</span>有病<span lang="EN-US" style="font-size: 10pt">"</span>，更加符合现实中的情况；而且客户端免除了直接创建产品对象的责任，而仅仅负责<span lang="EN-US" style="font-size: 10pt">"</span>消费<span lang="EN-US" style="font-size: 10pt">"</span>产品（正如暴发户所为）。<span lang="EN-US" style="font-size: 10pt"><br />
</span>下面我们从开闭原则上来分析下简单工厂模式。当暴发户增加了一辆车的时候，只要符合抽象产品制定的合同，那么只要通知工厂类知道就可以被客户使用了。那么对于产品部分来说，它是符合开闭原则的<span lang="EN-US" style="font-size: 10pt">--</span>对扩展开放、对修改关闭；但是工厂部分好像不太理想，因为每增加一辆车，都要在工厂类中增加相应的商业逻辑和判断逻辑，这显自然是违背开闭原则的。<span lang="EN-US" style="font-size: 10pt"><br />
</span>对于这样的工厂类（在我们的例子中是为司机师傅），我们称它为全能类或者上帝类。<span lang="EN-US" style="font-size: 10pt"><br />
</span>我们举的例子是最简单的情况，而在实际应用中，很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品，所以这可能会把我们的上帝类坏了，进而累坏了我们可爱的程序员<span lang="EN-US" style="font-size: 10pt">:( <br />
</span>正如我前面提到的简单工厂模式适用于业务将简单的情况下。而对于复杂的业务环境可能不太适应阿。这就应该由工厂方法模式来出场了！！<span lang="EN-US" style="font-size: 10pt"><o:p></o:p></span></span></p>
<p style="line-height: 150%"><span style="font-size: 10pt; line-height: 150%">四、工厂方法模式<span lang="EN-US" style="font-size: 10pt"><br />
</span>先来看下它的组成吧：<span lang="EN-US" style="font-size: 10pt"><br />
</span>1、抽象工厂角色：这是工厂方法模式的核心，它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在<span lang="EN-US" style="font-size: 10pt">java</span>中它由抽象类或者接口来实现。<span lang="EN-US" style="font-size: 10pt"><br />
</span>2、具体工厂角色：它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在<span lang="EN-US" style="font-size: 10pt">java</span>中它由具体的类来实现。<span lang="EN-US" style="font-size: 10pt"><br />
</span>3、抽象产品角色：它是具体产品继承的父类或者是实现的接口。在<span lang="EN-US" style="font-size: 10pt">java</span>中一般有抽象类或者接口来实现。<span lang="EN-US" style="font-size: 10pt"><br />
</span>4、具体产品角色：具体工厂角色所创建的对象就是此角色的实例。在<span lang="EN-US" style="font-size: 10pt">java</span>中由具体的类来实现。<span lang="EN-US" style="font-size: 10pt"><br />
</span>来用类图来清晰的表示下的它们之间的关系：<span lang="EN-US" style="font-size: 10pt"><o:p></o:p></span></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%"><img onmousewheel="return bbimg(this)" style="width: 736px; cursor: pointer; height: 311px" onclick="javascript:window.open(this.src);" height="311" src="http://blog.csai.cn/UploadFiles/2009-2/26950544.jpg" width="736" onload="rsimg(this,500)" resized="true"  alt="" /><br style="mso-special-character: line-break" />
</span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%"><o:p></o:p></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%"><o:p></o:p></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%"><a title="14_1229_58155C2.jpg" href="http://blog.javawind.net:8080/Upload/Archives/2008-06/14_1229_58155C2.jpg"></a><o:p></o:p></span></p>
<p style="line-height: 150%"><span style="font-size: 10pt; line-height: 150%">我们还是老规矩使用一个完整的例子来看看工厂模式各个角色之间是如何来协调的。话说暴发户生意越做越大，自己的爱车也越来越多。这可苦了那位司机师傅了，什么车它都要记得，维护，都要经过他来使用！于是暴发户同情他说：看你跟我这么多年的份上，以后你不用这么辛苦了，我给你分配几个人手，你只管管好他们就行了！于是，工厂方法模式的管理出现了。代码如下：<span lang="EN-US" style="font-size: 10pt"><br />
//</span>抽象产品角色，具体产品角色与简单工厂模式类似，只是变得复杂了些，这里略。<span lang="EN-US" style="font-size: 10pt"><br />
//</span>抽象工厂角色<span lang="EN-US" style="font-size: 10pt"><br />
public interface Driver{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Car driverCar(); <br />
} <br />
public class BenzDriver implements Driver{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Car driverCar(){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new Benz();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
} <br />
public class BmwDriver implements Driver{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Car driverCar() {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new Bmw();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
} <br />
......//</span>应该和具体产品形成对应关系，这里略<span lang="EN-US" style="font-size: 10pt">... <br />
//</span>有请暴发户先生<span lang="EN-US" style="font-size: 10pt"> <br />
public class Magnate <br />
{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Driver driver = new BenzDriver();<o:p></o:p></span></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Car car = driver.driverCar();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;car.drive();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception e)&nbsp;&nbsp;{ }&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
} <br />
</span><span style="font-size: 10pt; line-height: 150%">工厂方法使用一个抽象工厂角色作为核心来代替在简单工厂模式中使用具体类作为核心。让我们来看看工厂方法模式给我们带来了什么？使用开闭原则来分析下工厂方法模式。当有新的产品（即暴发户的汽车）产生时，只要按照抽象产品角色、抽象工厂角色提供的合同来生成，那么就可以被客户使用，而不必去修改任何已有的代码。看来，工厂方法模式是完全符合开闭原则的！<span lang="EN-US" style="font-size: 10pt"><br />
</span>使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时，就会出现大量的与之对应的工厂类，这不应该是我们所希望的。所以我建议在这种情况下使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类：即对于产品树上类似的种类（一般是树的叶子中互为兄弟的）使用简单工厂模式来实现。<span lang="EN-US" style="font-size: 10pt"><br />
</span>当然特殊的情况，就要特殊对待了：对于系统中存在不同的产品树，而且产品树上存在产品族，那么这种情况下就可能可以使用抽象工厂模式了。<span lang="EN-US" style="font-size: 10pt"><o:p></o:p></span></span></p>
<p style="line-height: 150%"><span style="font-size: 10pt; line-height: 150%">五、小结<span lang="EN-US" style="font-size: 10pt"><br />
</span>让我们来看看简单工厂模式、工厂方法模式给我们的启迪：<span lang="EN-US" style="font-size: 10pt"><br />
</span>如果不使用工厂模式来实现我们的例子，也许代码会减少很多<span lang="EN-US" style="font-size: 10pt">--</span>只需要实现已有的车，不使用多态。但是在可维护性上，可扩展性上是非常差的（你可以想象一下，添加一辆车后要牵动的类）。因此为了提高扩展性和维护性，多写些代码是值得的。<span lang="EN-US" style="font-size: 10pt"><o:p></o:p></span></span></p>
<p style="line-height: 150%"><span style="font-size: 10pt; line-height: 150%">六、抽象工厂模式<span lang="EN-US" style="font-size: 10pt"><br />
</span>先来认识下什么是产品族：位于不同产品等级结构中，功能相关联的产品组成的家族。如果光看这句话就能清楚的理解这个概念，我不得不佩服你啊。还是让我们用一个例子来形象地说明一下吧。<span lang="EN-US" style="font-size: 10pt"><o:p></o:p></span></span></p>
<p style="line-height: 150%"><span style="font-size: 10pt; line-height: 150%">图中的<span lang="EN-US" style="font-size: 10pt">BmwCar</span>和<span lang="EN-US" style="font-size: 10pt">BenzCar</span>就是两个产品树（产品层次结构）；而如图所示的<span lang="EN-US" style="font-size: 10pt">BenzSportsCar</span>和<span lang="EN-US" style="font-size: 10pt">BmwSportsCar</span>就是一个产品族。他们都可以放到跑车家族中，因此功能有所关联。同理<span lang="EN-US" style="font-size: 10pt">BmwBussinessCar</span>和<span lang="EN-US" style="font-size: 10pt">BenzSportsCar</span>也是一个产品族。<span lang="EN-US" style="font-size: 10pt"><br />
</span>回到抽象产品模式的话题上，可以这么说，它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为：给客户端提供一个接口，可以创建多个产品族中的产品对象。而且使用抽象工厂模式还要满足一下条件：<span lang="EN-US" style="font-size: 10pt"><br />
1.</span>系统中有多个产品族，而系统一次只可能消费其中一族产品<span lang="EN-US" style="font-size: 10pt"><br />
2.</span>同属于同一个产品族的产品以其使用。<span lang="EN-US" style="font-size: 10pt"><br />
</span>来看看抽象工厂模式的各个角色（和工厂方法的如出一辙）：<span lang="EN-US" style="font-size: 10pt"><br />
</span>抽象工厂角色：这是工厂方法模式的核心，它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在<span lang="EN-US" style="font-size: 10pt">java</span>中它由抽象类或者接口来实现。<span lang="EN-US" style="font-size: 10pt"><br />
</span>具体工厂角色：它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在<span lang="EN-US" style="font-size: 10pt">java</span>中它由具体的类来实现。<span lang="EN-US" style="font-size: 10pt"><br />
</span>抽象产品角色：它是具体产品继承的父类或者是实现的接口。在<span lang="EN-US" style="font-size: 10pt">java</span>中一般有抽象类或者接口来实现。<span lang="EN-US" style="font-size: 10pt"><br />
</span>具体产品角色：具体工厂角色所创建的对象就是此角色的实例。在<span lang="EN-US" style="font-size: 10pt">java</span>中由具体的类来实现。<span lang="EN-US" style="font-size: 10pt"><br />
<a title="14_1229_DC70102.jpg" href="http://blog.javawind.net:8080/Upload/Archives/2008-06/14_1229_DC70102.jpg"></a><o:p></o:p></span></span></p>
<p style="line-height: 150%"><span lang="EN-US" style="font-size: 10pt; line-height: 150%"><o:p>&nbsp;<img onmousewheel="return bbimg(this)" style="width: 692px; cursor: pointer; zoom: 100%; height: 429px" onclick="javascript:window.open(this.src);" height="429" src="http://blog.csai.cn/UploadFiles/2009-2/26362899.jpg" width="692" onload="rsimg(this,500)" resized="true"  alt="" /></o:p></span></p>
<p style="line-height: 150%"><span style="font-size: 10pt; line-height: 150%">看过了前两个模式，对这个模式各个角色之间的协调情况应该心里有个数了，我就不举具体的例子了。只是一定要注意满足使用抽象工厂模式的条件哦，不然即使存在了多个产品树，也存在产品族，但是不能使用的。<span lang="EN-US" style="font-size: 10pt"><o:p></o:p></span></span></p>
</span></span></span></o:p></span></span></span>
 <img src ="http://www.blogjava.net/JeromeKwok/aggbug/284566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-06-29 11:24 <a href="http://www.blogjava.net/JeromeKwok/articles/284566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>