﻿<?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-虚幻世界-文章分类-设计模式</title><link>http://www.blogjava.net/robot86736711/category/50972.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 Mar 2012 04:54:33 GMT</lastBuildDate><pubDate>Tue, 20 Mar 2012 04:54:33 GMT</pubDate><ttl>60</ttl><item><title>单例模式（singleton）构建模式</title><link>http://www.blogjava.net/robot86736711/articles/371983.html</link><dc:creator>海峰</dc:creator><author>海峰</author><pubDate>Thu, 15 Mar 2012 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/robot86736711/articles/371983.html</guid><wfw:comment>http://www.blogjava.net/robot86736711/comments/371983.html</wfw:comment><comments>http://www.blogjava.net/robot86736711/articles/371983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robot86736711/comments/commentRss/371983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robot86736711/services/trackbacks/371983.html</trackback:ping><description><![CDATA[定义<br />&nbsp;&nbsp;&nbsp;&nbsp;在java程序中只有一个Class实例对象。<br />为何试用<br />&nbsp;&nbsp;&nbsp;&nbsp;比如类似于连接数据库这样的操作，只需要一个连接对象。这样可以节省内存，也有利于垃圾回收（GC）<br />&nbsp;&nbsp;&nbsp;&nbsp;也可以状态化比如说论坛上的访问计数器。<br />&nbsp;&nbsp;&nbsp;&nbsp;也可以做无状态的工具性质的功能。<br />例子：
<p class="MsoNormal"><span style="font-size: 10.5pt" lang="EN-US">public class Singleton { <o:p></o:p></span></p>
<p>　　<span lang="EN-US">private static Singleton instance = null;<br /><br />　　public static synchronized Singleton getInstance() {<br />　　 　<br />　　//使用时生成实例，提高了效率！<br />　　if (instance==null)<br />　　　　instance＝new Singleton();<br />　　return instance; 　　} <o:p></o:p></span></p>
<p><span lang="EN-US">} <o:p></o:p></span></p><br />
<p>使用<span lang="EN-US">Singleton.getInstance()可以访问单态类。<o:p></o:p></span></p><br />但是值得注意的是在分布式的情况下一定要注意，不同的对象都去装在单例对象。<br /><br /><img src ="http://www.blogjava.net/robot86736711/aggbug/371983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robot86736711/" target="_blank">海峰</a> 2012-03-15 23:10 <a href="http://www.blogjava.net/robot86736711/articles/371983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建造者模式（builder）构建模式</title><link>http://www.blogjava.net/robot86736711/articles/371980.html</link><dc:creator>海峰</dc:creator><author>海峰</author><pubDate>Thu, 15 Mar 2012 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/robot86736711/articles/371980.html</guid><wfw:comment>http://www.blogjava.net/robot86736711/comments/371980.html</wfw:comment><comments>http://www.blogjava.net/robot86736711/articles/371980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robot86736711/comments/commentRss/371980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robot86736711/services/trackbacks/371980.html</trackback:ping><description><![CDATA[定义<br />&nbsp;&nbsp;&nbsp;&nbsp;将一个对象的复杂构建过程和表示分离开<br />含义<br />&nbsp;&nbsp;&nbsp;&nbsp;就是将对象的复杂的构建过程分离开，已达到解耦过程和部件。<br />为何试用<br />&nbsp;&nbsp;&nbsp;&nbsp;例如你需要加工手机，如果每个型号的手机都有一个加工组装厂，会不会感觉很多余呀。你只需要建造一个组装厂即可，安装的过程吗肯定都是一样的。所以你给我什么型号的手机部件我就给你组装什么型号的手机。这样将手机的组装和手机的部件有效的分离开减少耦合。而且有利于维护，比如说有一天手机天线不需要外置了，都已经内置了。那只要告诉组装厂减去装外置天线的哪一步就够了。<br /><br />例子:<br />
<p><span lang="EN-US">public interface Builder { <o:p></o:p></span></p>
<p>　　<span lang="EN-US">//创建部件A　<br />　　void buildPartA(); <br />　　//创建部件B <br />　　void buildPartB(); <br /><br />　　//返回最后组装成品结果<br />　　//成品的组装过程不在这里进行,而是转移到下面的Director类中进行.<br />　　//从而实现了解耦<strong><em>过程</em></strong>和<strong><em>部件</em></strong><br />　　Product getResult(); <o:p></o:p></span></p>
<p><span lang="EN-US">} <br /><br /></p>
<p><span lang="EN-US">public class Director {<o:p></o:p></span></p>
<p>　　<span lang="EN-US">private Builder builder; <o:p></o:p></span></p>
<p>　　<span lang="EN-US">public Director( Builder builder ) { <br />　　　　this.builder = builder; <br />　　} <br />　　// 将部件partA partB最后组成复杂对象<br />　　public void construct() { <br />　　　　builder.buildPartA();<br />　　　　builder.buildPartB();<br /></span></p>
<p>　　<span lang="EN-US">} <o:p></o:p></span></p>
<p><span lang="EN-US">}<br /><br /></p>
<p><span lang="EN-US">public class ConcreteBuilder implements Builder { <o:p></o:p></span></p>
<p>　　<span lang="EN-US">Part partA, partB; <br />　　public void buildPartA() {<br />　　　　//这里是具体如何构建partA的代码<br /><br />　　}; <br />　　public void buildPartB() { <br />　　　　//这里是具体如何构建partB的代码<br />　　}; <br />　　 public Product getResult() { <br />　　　　//返回最后组装成品结果<br />　　}; <o:p></o:p></span></p>
<p><span lang="EN-US">}<br /><br />我们看看如何调用Builder模式:<br />ConcreteBuilder builder = new ConcreteBuilder();<br />Director director = new Director( builder ); <br />director.construct(); <br />Product product = builder.getResult(); <br /><br /><o:p></o:p><o:p></o:p></span></p>
<p></span></p>
<p><o:p></o:p></span></p><img src ="http://www.blogjava.net/robot86736711/aggbug/371980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robot86736711/" target="_blank">海峰</a> 2012-03-15 22:51 <a href="http://www.blogjava.net/robot86736711/articles/371980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原型模式（prototype）构建模式 </title><link>http://www.blogjava.net/robot86736711/articles/371888.html</link><dc:creator>海峰</dc:creator><author>海峰</author><pubDate>Wed, 14 Mar 2012 14:48:00 GMT</pubDate><guid>http://www.blogjava.net/robot86736711/articles/371888.html</guid><wfw:comment>http://www.blogjava.net/robot86736711/comments/371888.html</wfw:comment><comments>http://www.blogjava.net/robot86736711/articles/371888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robot86736711/comments/commentRss/371888.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robot86736711/services/trackbacks/371888.html</trackback:ping><description><![CDATA[定义<br />&nbsp;&nbsp;&nbsp;&nbsp;用原型实例制定穿件对象的类型，并拷贝这个原型来创建对象。<br />含义<br />&nbsp;&nbsp;&nbsp;&nbsp;一个操作或是一个对象在创建一个制定的对象的时候，无需知道该对象的创建过程，根据所给的原型对象拷贝出所需的对象。<br />使用<br />&nbsp;&nbsp;&nbsp;&nbsp;因为java语言中有clone()方法，所以实现起来很容易。<br />例子 
<p class="MsoNormal"><span style="font-size: 10pt" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;public abstract class AbstractPrototype implements Cloneable<br /></span><span style="font-size: 10pt" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;{ <br /></span><span style="font-size: 10pt" lang="EN-US">　　&nbsp;&nbsp;&nbsp;&nbsp;String name; <br /><br /></span><span style="font-size: 10pt" lang="EN-US">　　&nbsp;&nbsp;&nbsp;&nbsp;public void setName(String Name) {this.name = name;}<br /></span><span style="font-size: 10pt" lang="EN-US">　　&nbsp;&nbsp;&nbsp;&nbsp;public String getName() {return this.name;}<br /><br /></span><span style="font-size: 10pt" lang="EN-US">　&nbsp;&nbsp;&nbsp;&nbsp;　public Object clone() <br /></span><span style="font-size: 10pt" lang="EN-US">　　&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="font-size: 10pt" lang="EN-US">　　　&nbsp;&nbsp;&nbsp;&nbsp;　Object object = null;<br /></span><span style="font-size: 10pt" lang="EN-US">　　　　&nbsp;&nbsp;&nbsp;&nbsp;try {<br /></span><span style="font-size: 10pt" lang="EN-US">　　　　　　&nbsp;&nbsp;&nbsp;&nbsp;object = super.clone();<br /></span><span style="font-size: 10pt" lang="EN-US">　　　　&nbsp;&nbsp;&nbsp;&nbsp;} catch (CloneNotSupportedException exception) {<br /></span><span style="font-size: 10pt" lang="EN-US">　　　　　　&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("<font size="2">AbstractPrototype</font> is not Cloneable");<br /></span><span style="font-size: 10pt" lang="EN-US">　　　　&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="font-size: 10pt" lang="EN-US">　　　　&nbsp;&nbsp;&nbsp;&nbsp;return object;<br /></span><span style="font-size: 10pt" lang="EN-US">　　&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="font-size: 8pt" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-size: 10pt" lang="EN-US"><o:p></o:p></span></p><br />
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;public class SoupPrototype extends AbstractPrototype<br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />　　&nbsp;&nbsp;&nbsp;&nbsp;public SoupPrototype()<br />　　&nbsp;&nbsp;&nbsp;&nbsp;{<br />　　　&nbsp;&nbsp;&nbsp;&nbsp;　setName("Soup Prototype"); <br />　　&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<o:p></o:p></span></p><br />
<p><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;public class SaladPrototype extends AbstractPrototype<br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />　&nbsp;&nbsp;&nbsp;&nbsp;　public SaladPrototype()<br />　　&nbsp;&nbsp;&nbsp;&nbsp;{<br />　　　&nbsp;&nbsp;&nbsp;&nbsp;　setName("Salad Prototype"); <br />　　&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<o:p></o:p></span></p><br />&nbsp;调用就很简单了<br />&nbsp;&nbsp;&nbsp;&nbsp;<span lang="EN-US">AbstractPrototype&nbsp;soup = new SoupPrototype();<br />&nbsp;&nbsp;&nbsp;&nbsp;AbstractPrototype&nbsp;salad = new SaladPrototype();<br />&nbsp;&nbsp;&nbsp;&nbsp;SoupPrototype soupClone =&nbsp;(SoupPrototype)soup.clone();<br />&nbsp;&nbsp;&nbsp;&nbsp;SaladPrototype saladClone =&nbsp;(SaladPrototype)salad.clone();<br /><br />这两个克隆出来的对象就是你想要的了 是不是很简单呀。<br /><br /></span><br /><img src ="http://www.blogjava.net/robot86736711/aggbug/371888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robot86736711/" target="_blank">海峰</a> 2012-03-14 22:48 <a href="http://www.blogjava.net/robot86736711/articles/371888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工厂模式（factory）构建模式</title><link>http://www.blogjava.net/robot86736711/articles/371066.html</link><dc:creator>海峰</dc:creator><author>海峰</author><pubDate>Thu, 01 Mar 2012 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/robot86736711/articles/371066.html</guid><wfw:comment>http://www.blogjava.net/robot86736711/comments/371066.html</wfw:comment><comments>http://www.blogjava.net/robot86736711/articles/371066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/robot86736711/comments/commentRss/371066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robot86736711/services/trackbacks/371066.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 写东西的能力有限，希望可以谅解。<br /><br />工厂模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义：提供创建对象的接口<br />&nbsp;为何使用：如果在一个项目中你需要new很多的实体，恰好这个实体new的过程很是复杂，而且有一天你的PM说在这个new的工程中加一个级别的过滤吧。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你会突然发现你的工作量怎么那么大呢！如果当时用到了工厂你就会发现原来加这个需求是这么的简单。而且在new的过程出现错误的几率将<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大大的降低了。你的代码也将会非常整洁。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实例：（直接上代码，发现弄图片是如此的麻烦！）&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这只是一个小例子，会根据给出的颜色来给出具体的实例<br />
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public class WorkFactory {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static Work getWork(String color){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return color.equals("black")?new BlackWork():new WhiteWork();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />抽象工厂<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;定义：如果工厂是生产实例的，那抽象工厂就是一个整个工厂的架构没有具体的实现<br />&nbsp; 为何使用：比如人家想用你的工厂，但是你又不想让人家看到你工厂里面具体的工作，并且你还要告诉他你工厂可能干什么。这时候你就可以给他看你的抽象的工厂<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而不是真正再生产的工厂了。而且利于扩展，比如又让你建一个工厂和上一个在实现上有区别但是还是那几个方法。这样你利用抽象工厂很快就可以搭建<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这另一个工厂了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实例：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public abstract class AbstractFactory {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public abstract Work getWork() throws Exception;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public abstract Study getStudy() throws Exception;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;</p></div> <img src ="http://www.blogjava.net/robot86736711/aggbug/371066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robot86736711/" target="_blank">海峰</a> 2012-03-01 11:45 <a href="http://www.blogjava.net/robot86736711/articles/371066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>