??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲色图激情文学,精品韩国亚洲av无码不卡区,亚洲成A人片77777国产http://www.tkk7.com/mikechen/?sh)子商务技术架?/description>zh-cnFri, 09 May 2025 21:54:10 GMTFri, 09 May 2025 21:54:10 GMT60java classLoader 体系l构http://www.tkk7.com/mikechen/archive/2013/06/20/400762.html陈睿陈睿Thu, 20 Jun 2013 02:25:00 GMThttp://www.tkk7.com/mikechen/archive/2013/06/20/400762.htmlhttp://www.tkk7.com/mikechen/comments/400762.htmlhttp://www.tkk7.com/mikechen/archive/2013/06/20/400762.html#Feedback1http://www.tkk7.com/mikechen/comments/commentRss/400762.htmlhttp://www.tkk7.com/mikechen/services/trackbacks/400762.html

版权信息: 可以L转蝲, 转蝲时请务必以超链接形式标明文章原文出处, 即下面的声明.

原文出处Q?a style="text-decoration: none; color: #0044aa;">http://blog.chenlb.com/2009/06/java-classloader-architecture.html

jvm classLoader architectureQ?/strong>

  1. Bootstrap ClassLoader/启动cd载器 
    主要负责jdk_home/lib目录下的核心(j) api ?-Xbootclasspath 选项指定的jar包装入工作?/li>
  2. Extension ClassLoader/扩展cd载器 
    主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作?/li>
  3. System ClassLoader/pȝcd载器 
    主要负责java -classpath/-Djava.class.path所指的目录下的cMjar包装入工作?/li>
  4. User Custom ClassLoader/用户自定义类加蝲?java.lang.ClassLoader的子c? 
    在程序运行期? 通过java.lang.ClassLoader的子cd态加载class文g, 体现java动态实时类装入Ҏ(gu)?/li>

cd载器的特性:(x)

  1. 每个ClassLoader都维护了(jin)一份自q名称I间Q?同一个名U空间里不能出现两个同名的类?/li>
  2. Z(jin)实现java安全沙箱模型层的类加蝲器安全机? java默认采用?" 双亲委派的加载链 " l构?/li>
classloader-architecture

classloader-architecture

classloader-class-diagram

classloader-class-diagram

cd中, BootstrapClassLoader是一个单独的javac, 其实在这里, 不应该叫他是一个javacR因为,它已l完全不用java实现?jin)。它是在jvm启动Ӟ p构造v来的Q?负责javaq_核心(j)库?/p>

自定义类加蝲器加载一个类的步?/strong>

classloader-load-class

classloader-load-class

ClassLoader cd载逻辑分析Q?以下逻辑是除 BootstrapClassLoader 外的cd载器加蝲程Q?/strong>

  1. // (g)查类是否已被装蝲q?nbsp; 
  2. Class c = findLoadedClass(name);  
  3. if (c == null ) {  
  4.      // 指定cL被装载过  
  5.      try {  
  6.          if (parent != null ) {  
  7.              // 如果父类加蝲器不为空Q?nbsp;则委z父类加蝲  
  8.              c = parent.loadClass(name, false );  
  9.          } else {  
  10.              // 如果父类加蝲器ؓ(f)I, 则委z启动cd载加?nbsp; 
  11.              c = findBootstrapClass0(name);  
  12.          }  
  13.      } catch (ClassNotFoundException e) {  
  14.          // 启动cd载器或父cd载器抛出异常后, 当前cd载器其  
  15.          // 捕获Q?nbsp;q过findClassҎ(gu)Q?nbsp;pw加?nbsp; 
  16.          c = findClass(name);  
  17.      }  
  18. }  

U程上下文类加蝲?/strong>
java默认的线E上下文cd载器?pȝcd载器(AppClassLoader)?/p>

  1. // Now create the class loader to use to launch the application  
  2. try {  
  3.     loader = AppClassLoader.getAppClassLoader(extcl);  
  4. catch (IOException e) {  
  5.     throw new InternalError(  
  6. "Could not create application class loader" );  
  7. }   
  8.   
  9. // Also set the context class loader for the primordial thread.  
  10. Thread.currentThread().setContextClassLoader(loader);  

以上代码摘自sun.misc.Launch的无参构造函数Launch()?/p>

使用U程上下文类加蝲? 可以在执行线E中, 抛弃双亲委派加蝲链模? 使用U程上下文里的类加蝲器加载类.
典型的例子有, 通过U程上下文来加蝲W三方库jndi实现, 而不依赖于双亲委z?
大部分java app服务?jboss, tomcat..)也是采用contextClassLoader来处理web服务?br />q有一些采?hotswap Ҏ(gu)的框架, 也用了(jin)U程上下文类加蝲? 比如 seasar (full stack framework in japenese).

U程上下文从Ҏ(gu)解决?jin)一般应用不能违背双亲委z模式的问题.
使javacd载体pL得更灉|.

随着多核时代的来? 怿多线E开发将?x)越来越多地q入E序员的实际~码q程? 因此,
在编写基设施Ӟ 通过使用U程上下文来加蝲c? 应该是一个很好的选择?/p>

当然, 好东襉K有利? 使用U程上下文加载类, 也要注意, 保证多根需要通信的线E间的类加蝲器应该是同一?
防止因ؓ(f)不同的类加蝲? Dcd转换异常(ClassCastException)?/p>

Z么要使用q种双亲委托模式呢?

  1. 因ؓ(f)q样可以避免重复加蝲Q当父亲已经加蝲?jin)该cȝ时候,没有必要子ClassLoader再加载一ơ?/li>
  2. 考虑到安全因素,我们试想一下,如果不用这U委托模式,那我们就可以随时使用自定义的String来动态替代java核心(j)api中定义类型,q样?x)存在非常大的安全隐?zhn),而双亲委托的方式Q就可以避免q种情况Q因为String已经在启动时被加载,所以用戯定义cL无法加蝲一个自定义的ClassLoader?/li>

java动态蝲入class的两U方式:(x)

  1. implicit隐式,卛_用实例化才蝲入的Ҏ(gu)来动态蝲入class
  2. explicit昑ּ方式,又分两种方式:
    1. java.lang.Class的forName()Ҏ(gu)
    2. java.lang.ClassLoader的loadClass()Ҏ(gu)

用Class.forName加蝲c?/strong>

Class.forName使用的是被调用者的cd载器来加载类的?br />q种Ҏ(gu)? 证明?jin)javacd载器中的名称I间是唯一? 不会(x)怺q扰?br />卛_一般情况下, 保证同一个类中所兌的其他类都是由当前类的类加蝲器所加蝲的?/p>

  1. public static Class forName(String className)  
  2.      throws ClassNotFoundException {  
  3.      return forName0(className, true , ClassLoader.getCallerClassLoader());  
  4. }   
  5.   
  6. /** Called after security checks have been made. */  
  7. private static native Class forName0(String name, boolean initialize,  
  8. ClassLoader loader)  
  9.      throws ClassNotFoundException;  

上面?ClassLoader.getCallerClassLoader 是得到调用当前forNameҎ(gu)的类的类加蝲?/p>

static块在什么时候执?

  • 当调用forName(String)载入class时执?如果调用ClassLoader.loadClassq不?x)执?forName(String,false,ClassLoader)时也不会(x)执行.
  • 如果载入Class时没有执行static块则在第一ơ实例化时执?比如new ,Class.newInstance()操作
  • static块仅执行一?/li>

各个javacȝ哪些classLoader加蝲?

  • javacd以通过实例.getClass.getClassLoader()得知
  • 接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()获得实例)载入
  • ClassLoadercȝbootstrap loader载入

NoClassDefFoundError和ClassNotFoundException

  • NoClassDefFoundError:当java源文件已~译?class文g,但是ClassLoader在运行期间在其搜寻\径load某个cL,没有扑ֈ.class文g则报q个?/li>
  • ClassNotFoundException:试图通过一个String变量来创Z个ClasscL不成功则抛出q个异常


陈睿 2013-06-20 10:25 发表评论
]]>
l构模式-Composite模式http://www.tkk7.com/mikechen/archive/2012/08/06/384936.html陈睿陈睿Mon, 06 Aug 2012 09:49:00 GMThttp://www.tkk7.com/mikechen/archive/2012/08/06/384936.htmlhttp://www.tkk7.com/mikechen/comments/384936.htmlhttp://www.tkk7.com/mikechen/archive/2012/08/06/384936.html#Feedback0http://www.tkk7.com/mikechen/comments/commentRss/384936.htmlhttp://www.tkk7.com/mikechen/services/trackbacks/384936.html一Q用场?/strong>

   1Q用的地方Q树(wi)形结构,分支l构{?/p>

   2Q用的好处Q降低客L(fng)的用,Z(jin)辑ֈ元g与组合g使用的一致性,增加?jin)元件的~码

   3Q用后的坏处:(x)代码不容易理解,需要你认真ȝIӞ发现元g与组合g是怎么l合?br />

二:(x)一个实际的例子

    d形,q个模式Q稍微要隄解一点,有了(jin)例子p明了(jin)一切,我画的图是用接口做的Q代码实现是抽象cMؓ(f)基类Q你自己选择?jin),接口也可以?/p>

   


1Q先建立囑Ş元g

   package com.mike.pattern.structure.composite;
/**
* 囑Ş元g

* @author taoyu

* @since 2010-6-23
*/
public abstract class Graph {
/**囑Ş名称*/
protected String name;

public Graph(String name){
   this.name=name;
}

/**d*/
public abstract void draw()throws GraphException;

/**d囑Ş*/
public abstract void add(Graph graph)throws GraphException;

/**UL囑Ş*/
public abstract void remove(Graph graph)throws GraphException;

}

2)建立基础囑Ş?/strong>

package com.mike.pattern.structure.composite;
import static com.mike.util.Print.print;

/**
* 圆图?br />* 
* @author taoyu

* @since 2010-6-23
*/
public class Circle extends Graph {

public Circle(String name){
   super(name);
}

/**
* 圆添加图?br />* @throws GraphException 
*/
@Override
public void add(Graph graph) throws GraphException {
   throw new GraphException("圆是基础囑ŞQ不能添?);
}

/**
* 圆画?br />*/
@Override
public void draw()throws GraphException {
   print(name+"d?);
}

/**
* 圆移掉图?br />*/
@Override
public void remove(Graph graph)throws GraphException {
   throw new GraphException("圆是基础囑ŞQ不能移?);
}

}

3Q徏立基囑Ş长方?/strong>

package com.mike.pattern.structure.composite;
import static com.mike.util.Print.print;
/**
* 长方?br />* 
* @author taoyu

* @since 2010-6-23
*/
public class Rectangle extends Graph {

public Rectangle(String name){
   super(name);
}

/**
* 长方形添?br />*/
@Override
public void add(Graph graph) throws GraphException {
   throw new GraphException("长方形是基础囑ŞQ不能添?);
}

/**
* 画长方Ş
*/
@Override
public void draw() throws GraphException {
   print(name+"d?);
}

@Override
public void remove(Graph graph) throws GraphException {
   throw new GraphException("长方形是基础囑ŞQ不能移?);
}

}

4Q最后简历组合图?/strong>

package com.mike.pattern.structure.composite;

import java.util.ArrayList;
import java.util.List;
import static com.mike.util.Print.print;

/**
* 囑Şl合?br />* 
* @author taoyu

* @since 2010-6-23
*/
public class Picture extends Graph {
private List<Graph> graphs;

public Picture(String name){
   super(name);
   /**默认?0个长?/
   graphs=new ArrayList<Graph>();
}


/**
* d囑Ş元g
*/
@Override
public void add(Graph graph) throws GraphException {
   graphs.add(graph);
}

/**
* 囑Ş元gd
*/
@Override
public void draw() throws GraphException {
   print("囑Ş容器Q?+name+" 开始创?);
   for(Graph g : graphs){
    g.draw();
   }
}

/**
* 囑Ş元gUL囑Ş元g
*/
@Override
public void remove(Graph graph) throws GraphException {
   graphs.remove(graph);
}

}

5Q最后测?/strong>

public static void main(String[] args)throws GraphException {
   /**M个圆Q圆里包含一个圆和长方Ş*/
   Picture picture=new Picture("立方体圆");
   picture.add(new Circle("?));
   picture.add(new Rectangle("长方?));
  
   Picture root=new Picture("怪物囑Ş"); 
   root.add(new Circle("?));
   root.add(picture);
   root.draw();
}

6)使用?j)得Q的降低了(jin)客户端的使用情况Q让整个囑Ş可控?jin),当是你要深入ȝ解,才真名明白采用该模式的含义,不太?gu)理解?/p>

陈睿 2012-08-06 17:49 发表评论
]]>
l构模式-Adapter适配器模?/title><link>http://www.tkk7.com/mikechen/archive/2012/08/06/384935.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Mon, 06 Aug 2012 09:38:00 GMT</pubDate><guid>http://www.tkk7.com/mikechen/archive/2012/08/06/384935.html</guid><wfw:comment>http://www.tkk7.com/mikechen/comments/384935.html</wfw:comment><comments>http://www.tkk7.com/mikechen/archive/2012/08/06/384935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/mikechen/comments/commentRss/384935.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/mikechen/services/trackbacks/384935.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>一Q用场?/strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">     1Q用的地方Q我想用两个不同类的方法,q个时候你需要把它们l合h使用</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">     2Q目前用的情况Q我?x)把两个cȝL(fng)合的方式攑ֈ一P~程思想think in java里已l提CQ能量用组合就用组合,l承一般考虑再后?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">     3Q用后的好处:(x)你不需要改动以前的代码Q只是新装?jin)一新类Q由q个cL提供两个cȝҎ(gu)Q这个时候:(x)一定会(x)惛_facade外观模式Q本来是多个cM用的情况Q我新封装成一个类来用,而这个类我采用组合的方式来包装新的方法。我的理解是Q设计模式本w就是ؓ(f)?jin)帮助解决特定的业务场景而故意把模式划分对应的模式类别,其实大多数情况,都解决了(jin)同样的问题,q个时候其实没有必要过多的U缠到模式的名字上了(jin)Q你有好的注意,你甚臛_一个新的名字来概括q样的用场景?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">    4Q用的坏处Q适配器模式,有两U方式来实现。一个是l合一个是l承Q我觉得Q首先应该考虑l合Q能用组合就不要用承,q是W一个。第二个Q你采用l承来实玎ͼ那肯定会(x)加大l承?wi)结构,如果你的l承关系本n很复杂?jin),q肯定会(x)加大l承关系的维护,不有利于代码的理解,或则更加J琐。承是Z(jin)解决重用的ؓ(f)题而出现的Q所以我觉得不应该滥用承,有机?x)可以考虑同样别的Ҏ(gu)?br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>二:(x)一个实际的例子</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">      兌营销的例子,用户购买完商品后Q我又推荐他相关别的商品</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">      ׃减少代码Q方法我都不采用接口Q直接由cL提供Q代码只是一个范例而已Q都_?jin)?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>1)创徏订单信息</strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Order {<br />private Long orderId;<br />private String nickName;<br /><br />public Order(Long orderId,String nickName){<br />   this.orderId=orderId;<br />   this.nickName=nickName;<br />}<br /><br />/**<br />* 用户下订?br />*/<br />public void insertOrder(){<br />  <br />}<br />}<br /><br /></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>2Q商品信?/strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Auction {<br />/**商品名称*/<br />private String name;<br /><br />/**刉商*/<br />private String company;<br /><br />/**刉日?/<br />private Date date;<br /><br /><br />public Auction(String name,String company, Date date){<br />   this.name=name;<br />   this.company=company;<br />   this.date=date;<br />}<br /><br />/**<br />* 推广的商品列?br />*/<br />public void commendAuction(){<br />  <br />}<br /><br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>3Q购?/strong></p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; ">public class Trade {<br />/**用户订单*/<br />private Order order;<br /><br />/**商品信息*/<br />private Auction auction;<br /><br />public Trade(Order order ,Auction auction){<br />   this.order=order;<br />   this.auction=auction;<br />}<br /><br />/**<br />* 用户产生订单以及(qing)后箋(hu)的事?br />*/<br />public void trade(){<br />   /**下订?/<br />   order.insertOrder();<br />  <br />   /**兌推荐相关的商?/<br />   auction.commendAuction();<br />}<br /><br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: 'Microsoft Yahei', 微Y雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: 25px; background-color: #ffffff; "><strong>   4Q用心(j)得:(x)</strong>其实外面采用?jin)很多承的方式Qorderl承auction之后Q利用super .inserOrder()再加一个auction.recommendAuction(),实际上大同小异,我到觉得采用l合更容易理解以?qing)代码更加优点?/p><img src ="http://www.tkk7.com/mikechen/aggbug/384935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/mikechen/" target="_blank">陈睿</a> 2012-08-06 17:38 <a href="http://www.tkk7.com/mikechen/archive/2012/08/06/384935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创徏模式-Builder模式http://www.tkk7.com/mikechen/archive/2012/08/06/384934.html陈睿陈睿Mon, 06 Aug 2012 09:37:00 GMThttp://www.tkk7.com/mikechen/archive/2012/08/06/384934.htmlhttp://www.tkk7.com/mikechen/comments/384934.htmlhttp://www.tkk7.com/mikechen/archive/2012/08/06/384934.html#Feedback0http://www.tkk7.com/mikechen/comments/commentRss/384934.htmlhttp://www.tkk7.com/mikechen/services/trackbacks/384934.html一Q用场?/strong>

   1)使用到的地方Q如果你惛_建类似汽车这L(fng)对象Q首先要创徏轮子Q玻璃,桌椅Q发动机Q外廓等Q这些部仉创徏好后Q最后创建汽车成品,部g的创建和汽R的组装过E本w都很复杂的情况Q希望把部g的创建和成品的组装分开来做Q这h要做的事情分割开来,降低对象实现的复杂度Q也降低以后成本的维护,把汽车的部g创徏和组装过E独立出两个对应的工厂来做,有点cM建立两个对应的部件创建工厂和汽Rl装工厂两个工厂Q而工厂只是创Z个成品,q没有把里面的步骤也独立出来Q应该说Builder模式比工厂模式又q了(jin)一步?/p>

    2Q采用Builder模式后的好处Q把一个负责的对象的创E分解,把一个对象的创徏分成两个对象来负责创建,代码更有利于l护Q可扩性比较好?/p>

   3Q采用Builder模式后的坏处Q实现v来,对应的接口以?qing)部件的对象的创建比较多Q代码相Ҏ(gu)Ԍ比较多了(jin)Q估计刚开始你?x)有?gu)Q这个可以考虑代码_的问题,增加代码的可L? 

二:(x)一个实际的例子

汽R的组?/strong>

  1)首先创徏汽Rq个成品对象Q包含什么的成员

public class Car implements Serializable{

/**
* 汽R序列?br />*/
private static final long serialVersionUID = 1L;

/**汽R轮子*/
private Wheel wheel;

/**汽R发动?/
private Engine engine;

/**汽Rȝ*/
private Glass glass;

/**汽R座椅*/
private Chair chair;


public Wheel getWheel() {
   return wheel;
}

public void setWheel(Wheel wheel) {
   this.wheel = wheel;
}

public Engine getEngine() {
   return engine;
}

public void setEngine(Engine engine) {
   this.engine = engine;
}

public Glass getGlass() {
   return glass;
}

public void setGlass(Glass glass) {
   this.glass = glass;
}

public Chair getChair() {
   return chair;
}

public void setChair(Chair chair) {
   this.chair = chair;
}

}

2Q创建对应汽车零部g

public class Wheel {
public Wheel(){
   print("--汽R轮子构徏完毕--");
}
}

public class Engine {
public Engine(){
   print("--汽R发动机构建完?-");
}
}

public class Glass {
public Glass(){
   print("--汽Rȝ构徏完毕--");
}
}

public class Chair {
public Chair(){
   print("--汽R座椅构徏完毕--");
}
}

3Q开始重点了(jin)Q汽车成品的l装q程

   public interface Builder {
/**l装汽R轮子*/
public void buildWheel();

/**l装汽R发动?/
public void buildEngine();

/**l装汽Rȝ*/
public void buildGlass();

/**l装汽R座椅*/
public void buildChair();

/**q回l装好的汽R*/
public Car getCar();
}

以及(qing)实现c?/p>

public class CarBuilder implements Builder {
/**汽R成品*/
private Car car;

public CarBuilder(){
   car=new Car();
}

/**l装汽R轮子*/
@Override
public void buildChair() {
   car.setChair(new Chair());
}

/**l装汽R发动?/
@Override
public void buildEngine() {
   car.setEngine(new Engine());
}

/**l装汽Rȝ*/
@Override
public void buildGlass() {
   car.setGlass(new Glass());
}

/**l装汽R座椅*/
@Override
public void buildWheel() {
   car.setWheel(new Wheel());
}

/**q回l装好的汽R*/
@Override
public Car getCar() {
   buildChair();
   buildEngine();
   buildGlass();
   buildWheel();
   print("--整个汽R构徏完毕--");
   return car;
}

}

4Q最后汽车创建测?/strong>

   public static void main(String[] args) {
   /**创徏汽Rl装*/
   Builder carBuilder=new CarBuilder();
   Car car=carBuilder.getCar();
}

   最后输出:(x)

--汽R座椅构徏完毕--
--汽R发动机构建完?-
--汽Rȝ构徏完毕--
--汽R轮子构徏完毕--
--整个汽R构徏完毕--

   5Q?strong>体会(x)?j)得Q?/strong>Builder模式实际的重点就把汽车的l装q程和零部g的生产分开来实玎ͼ雉件的生成主要靠自q对象来实玎ͼ我上面只是在构造函数里创徏?jin),比较单,而重Ҏ(gu)车的l装则交lC(j)arBuilder来实玎ͼ最l由builder来先负责雉件的创徏Q最后返回出成品的汽车?/p>

陈睿 2012-08-06 17:37 发表评论
]]>
创徏模式-singleon单例模式http://www.tkk7.com/mikechen/archive/2012/08/06/384932.html陈睿陈睿Mon, 06 Aug 2012 09:33:00 GMThttp://www.tkk7.com/mikechen/archive/2012/08/06/384932.htmlhttp://www.tkk7.com/mikechen/comments/384932.htmlhttp://www.tkk7.com/mikechen/archive/2012/08/06/384932.html#Feedback0http://www.tkk7.com/mikechen/comments/commentRss/384932.htmlhttp://www.tkk7.com/mikechen/services/trackbacks/384932.html一Q用场?br />

    1Q经怋用的地方Q一个类只有一个实例,eg:面讉Kl计pvQ统计的个数只能保证一个实例的l计?/p>

    2Q我们目前用的情况Q比如我惛_Z个对象,q个对象希望只有一份实例的l护Q在内存的保存(sh)只有一份,也就是在同一个jvm的java堆里只保存(sh)份实例对象,所以你?x)想一办法Q在创徏q个对象的时候,已l能保证只有一份?/p>

    3Q怎么改进Q定义该对象的时候,׃证是同一份实例,比如Q定义ؓ(f)U有构造函敎ͼ防止通过new的方式可以创建对象,然后在对象里定义一个静(rn)态的U有成员Q本w对象的一个实例)(j)Q然后再创徏一个外面访问该对象的方法就好了(jin)?/p>

    4Q改q的好处Q代码在~译代码q个U别p控制?jin),不至于在jvm里运行的时候才来保证,把唯一实例的创Z证在~译阶段Qjvm里内存只有一份,从而内存占有率更低Q以?qing)更方便java垃圾回收

    5Q改q后的坏处:(x)只能是代码稍微需要更多点Q其实大家最后发现改q后的坏处,都是代码定义比之间要多一点,但以后的l护代码降下来?jin),也短暂的代码量偏大来换取以后代码的精?br />

二:(x)一个实际的例子

M的例?/p>

package com.mike.pattern.singleton;

/**
* ȝ

* @author taoyu

* @since 2010-6-22
*/
public class President {
private President(){
   System.out.println("ȝ已经选D出来?);
}

/**ȝ只有一?/
private static President president=new President();

/**
* q回ȝ
*/
public static President getPresident(){
   return president;
}

/**
* ȝ宣布选D成功
*/
public void announce(){
   System.out.println("伟大的中国h民,我将成你们新的ȝ");
}
}

/**
* @param args
*/
public static void main(String[] args) {
   President president=President.getPresident();
   president.announce();
}



陈睿 2012-08-06 17:33 发表评论
]]>
创徏模式-工厂模式http://www.tkk7.com/mikechen/archive/2012/08/06/384931.html陈睿陈睿Mon, 06 Aug 2012 09:28:00 GMThttp://www.tkk7.com/mikechen/archive/2012/08/06/384931.htmlhttp://www.tkk7.com/mikechen/comments/384931.htmlhttp://www.tkk7.com/mikechen/archive/2012/08/06/384931.html#Feedback0http://www.tkk7.com/mikechen/comments/commentRss/384931.htmlhttp://www.tkk7.com/mikechen/services/trackbacks/384931.html1.使用场景

     1Q子c过多,不容易管理;构造对象过E过长;_代码创徏Q?br />

    2)目前我们代码情况Q?~写代码的时候,我们l常都在new对象Q创Z个个的对象,而且q有很多ȝ(ch)的创建方式,eg:HashMap<String,Float> grade=new HashMap<String,Float>(),q样的代码创建方式太冗长?jin),N你没有想q把q个创徏变的短一点么Q比如:(x)HashMap<String,Float>grade=HashMapFactory.new(),可以把你创徏_一点;你也可以q有别的需求,在创建对象的时候,你需要不同的情况Q创建统一U类别的对象Qeg:我想生成不同的汽车,创徏车,创徏卡RQ创建公交汽车等{,都属于同U类别:(x)汽RQ你N没有惌Q我把这些创建的对象在一个工厂里来负责创建,我把创徏分开化,交给一人来负责Q这样可以让代码更加Ҏ(gu)理Q创建方式也可以单点?/p>

比如QCar    BMW=CarFactory.create(bmw);   把创建new׃个统一负责Q这L(fng)理v来相当方?/p>

    3Q怎么改进Q这个时候,你会(x)惛_Q创样同cd的东西,我把q个权利分出去,让一个h来单独管理,它只负责创徏我的对象q个事情Q所以你单独历一个对象来创徏同类的对象,q个时候,你想q个东西有点像工厂一P生成同样的品,所以取?jin)个名字Q工厂模式,֐思义Q只负责对象的创?/p>

    4Q改q后的好处:(x)代码更加Ҏ(gu)理?jin),代码的创z很多?/p>

    5Q改q后的坏处:(x)那就是你需要单独加一个工厂对象来负责创徏Q多需要写点代码?br />

2.一个实际的例子

   创徏宝马汽R与奔驰汽车的例子

   1Q先提取Z个汽车的公用接口Car

       public interface Car{

          /**行驶*/    

          public void drive();

        }

   2)宝马和奔驰汽车对?/p>

public class BMWCar implements Car {

/**
* 汽R发动
*/
public void drive(){
   System.out.println("BMW Car drive");
}
}

public class BengCar implements Car {

/**
* 汽R发动
*/
public void drive(){
   System.out.println("BengChi Care drive");
}
}

    3)单独一个汽车工厂来负责创徏

     public class FactoryCar {
/**
* 刉汽?br />*
* @param company 汽R公司
* @return 汽R
* @throws CreateCarException 刉汽车失败异?br />*/
public static Car createCar(Company company)throws CreateCarException{
   if(company==Company.BMW){
    return new BMWCar();
   }else if(company==Company.Beng){
    return new BengCar();
   }
   return null;
}
}

    4Q最后的代码实现Q?/p>

    Car BMWCar=FactoryCar.createCar(Company.BMW);
     BMWCar.drive();



陈睿 2012-08-06 17:28 发表评论
]]>
设计模式我的理解http://www.tkk7.com/mikechen/archive/2012/08/06/384928.html陈睿陈睿Mon, 06 Aug 2012 09:22:00 GMThttp://www.tkk7.com/mikechen/archive/2012/08/06/384928.htmlhttp://www.tkk7.com/mikechen/comments/384928.htmlhttp://www.tkk7.com/mikechen/archive/2012/08/06/384928.html#Feedback0http://www.tkk7.com/mikechen/comments/commentRss/384928.htmlhttp://www.tkk7.com/mikechen/services/trackbacks/384928.html   1. 我说下我对设计模式的理解QQ何一样事物都是因为有需求的驱动才诞生的Q所以设计模式也不例外,我们qx(chng)在编写代码的时候,随着旉的深入,发现很多代码很难l护Q可扩展性差,以及(qing)代码的效率也比较低,q个时候你肯定?x)想办法让代码变的优又能解决你目中的问题Q所以在面向对象语言里,你肯定会(x)d现很多可以重用的公用的方法,比如Q接口的存在Q你自然想C(jin)Q让你定义的Ҏ(gu)与你的实现分开Q也可以很方便把不同的类与接口匹配v来,形成?jin)一个公用的接口Q你?x)发现这样做Q好处会(x)是非常多的,解决?jin)你qx(chng)x(chng)代码的申明与逻辑实现的分开?/p>

    2. q个时候,你发C(jin)Q本w面向对象的语言里,已经暗藏?jin)很多好处,你肯定?x)仔细d析面向对象这个语aQ认真去挖掘里面更多的奥U,最后,你发C(jin)Q原来你可以把面向对象的Ҏ(gu)提取成一个公用的实现案例Q这些案例里能帮助你解决你^时编写代码的困扰Q而这样一hQ就是所谓gof的成员,他们从^时设计徏{方面找C(jin)灉|Q徏{的设计也可以公用化以及(qing)重用化,所以他们也提取?jin)相关的软g设计斚w的公用案例,也就有了(jin)下面的相关的所?3U设计模式,而里面这么多模式Q你也可以把他们归类hQ最后发现就几类模式Q创建,l构Q行为等模式cdQ而这些现成的Ҏ(gu)Q也可以在实际应用中充分发挥作用Q随着大家的用以?qing)理解,发现其实q些所谓的模式里,你的可以让你的代码变的更加优美与简l?/p>

    3. 我比较喜Ƣ把代码变的更加优美与简l,优美的代码就是一看就懂,l构很清晎ͼ而简历就是一目了(jin)?dng)又可以解决你的问题,是代码又少效率又高Q所以^时要L写java doc的习(fn)惯,q样的代码才为清晎ͼ所以才?x)更加优?/p>

    4. q些是我对设计模式的理解,所以这么好的宝贝,我们不去深入的了(jin)解,的确可惜?jin),q就叫站到巨人的肩膀?....



陈睿 2012-08-06 17:22 发表评论
]]>
操作pȝ-linux常用命o(h)http://www.tkk7.com/mikechen/archive/2012/07/24/383815.html陈睿陈睿Tue, 24 Jul 2012 02:28:00 GMThttp://www.tkk7.com/mikechen/archive/2012/07/24/383815.htmlhttp://www.tkk7.com/mikechen/comments/383815.htmlhttp://www.tkk7.com/mikechen/archive/2012/07/24/383815.html#Feedback0http://www.tkk7.com/mikechen/comments/commentRss/383815.htmlhttp://www.tkk7.com/mikechen/services/trackbacks/383815.html一Q网l配|?/strong>

      1.x(chng)防火?   
1) 重启后生?nbsp;
开启:(x) chkconfig iptables on 
关闭Q?chkconfig iptables off 
2) x(chng)生效Q重启后失效 
开启:(x) service iptables start 
关闭Q?service iptables stop
    2.下蝲软g
wget curl
    3.安装和解?/div>
        安装 rpm -ivh
        升 rpm -Uvh
        卸蝲 rpm -e
        tar -zxvf 
  
二:(x)|卡讄
   1?讄ip地址Q即时生效,重启失效Q?/div>
  #ifconfig eth0 ip地址 netmask 子网掩码
  
  2?讄ip地址Q重启生效,怹生效Q?/div>
  #setup
  
  3?通过配置文g讄ip地址Q重启生效,怹生效Q?/div>
  #vi /etc/sysconfig/network-scripts/ifcfg-eth0
  DEVICE=eth0 #讑֤名,与文件同名?/div>
  ONBOOT=yes #在系l启动时Q启动本讑֤?/div>
  BOOTPROTO=static
  IPADDR=202.118.75.91 #此网卡的IP地址
  NETMASK=255.255.255.0 #子网掩码
  GATEWAY=202.118.75.1 #|关IP
  MACADDR=00:02:2D:2E:8C:A8 #mac地址
  
  4?重启|络服务
  #service network restart //重启所有网?/div>
  
  5?用|卡,启动|卡
  #ifdown eth0
  #ifup eth0
  
  6?屏蔽|卡Q显C网?/div>
  #ifconfig eth0 down
  #ifconfig eth0 up
  
  7?配置DNS客户端(最多三个)(j)
  #vi /etc/resolv.conf
  nameserver 202.99.96.68
  
  8、更改主机名Q即时生效)(j)
  #hostname L?/div>
  
  9、更改主机名Q重启计机生效Q永久生效)(j)
  #vi /etc/sysconfig/network
  HOSTNAME=L?br />
三:(x)两台l(f)inux拯命o(h)Qscp

1.安装scp:yum install openssh-clients 
2.scp  -r 本地用户名@IP地址:文g? q程用户名@IP地址:文g?


陈睿 2012-07-24 10:28 发表评论
]]>服务?Nginxhttp://www.tkk7.com/mikechen/archive/2012/07/06/382346.html陈睿陈睿Fri, 06 Jul 2012 03:09:00 GMThttp://www.tkk7.com/mikechen/archive/2012/07/06/382346.htmlhttp://www.tkk7.com/mikechen/comments/382346.htmlhttp://www.tkk7.com/mikechen/archive/2012/07/06/382346.html#Feedback0http://www.tkk7.com/mikechen/comments/commentRss/382346.htmlhttp://www.tkk7.com/mikechen/services/trackbacks/382346.html阅读全文

陈睿 2012-07-06 11:09 发表评论
]]>
框架-quartzhttp://www.tkk7.com/mikechen/archive/2012/07/03/382090.html陈睿陈睿Tue, 03 Jul 2012 06:42:00 GMThttp://www.tkk7.com/mikechen/archive/2012/07/03/382090.htmlhttp://www.tkk7.com/mikechen/comments/382090.htmlhttp://www.tkk7.com/mikechen/archive/2012/07/03/382090.html#Feedback2http://www.tkk7.com/mikechen/comments/commentRss/382090.htmlhttp://www.tkk7.com/mikechen/services/trackbacks/382090.html一Qquartz?/strong>
       OpenSymphony 的Quartz提供?jin)一个比较完的d调度解决Ҏ(gu)?/span>
       Quartz 是个开源的作业调度框架Q定时调度器Qؓ(f)?Java 应用E序中进行作业调度提供了(jin)单却强大的机制?/div>
       Quartz中有两个基本概念Q作业和触发器。作业是能够调度的可执行dQ触发器提供?jin)对作业的调?br />
二:(x)quartz spring配置详解
  •  Z么不适用java.util.Timerl合java.util.TimerTask 
        1.主要的原因,适用不方便,特别是制定具体的q月日时分的旉Q而quartz使用cMlinux上的cron配置Q很方便的配|每隔时间执行触发?br />
        2.其次性能的原因,使用jdk自带的Timer不具备多U程Q而quartz采用U程池,性能上比timer高出很多?br />

  •    详解quartz在spring里面的配|?/strong>
    在spring里主要分ZU用方式:(x)W一U,也是目前使用最多的方式Qspring提供的MethodInvokingJobDetailFactoryBean代理c,通过雷利cȝ接调用Q务类的某个函敎ͼW二U?E序里实现quartz接口Qquartz通过该接口进行调度?br />
      主要讲解通过spring提供的代理类MethodInvokingJobDetailFactoryBean

        1.业务逻辑c?业务逻辑是独立的Q本w就与quartz解耦的Qƈ没有深入q去Q这对业务来讲是很好的一个方式?br />
                        public class  TestJobTask{
     

      /**
       *业务逻辑处理
       
*/
        public void   service(){
            /**业务逻辑*/
                ..
        }

}
       
    2.增加一个线E池
    <!-- U程执行器配|,用于d注册 -->
<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
 <property name="corePoolSize" value="10" />
 <property name="maxPoolSize" value="100" />
 <property name="queueCapacity" value="500" />
</bean>

  3.定义业务逻辑c?br />
    <!-- 业务对象 -->
<bean id="testJobTask" class="com.mike.scheduling.TestJobTask" />


    4.增加quartz调用业务逻辑

    <!-- 调度业务 -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 <property name="targetObject" ref="testJobTask" />
 <property name="targetMethod" value="service" />
</bean>

    5.增加调用的触发器Q触发的旉Q有两种方式Q?br />
     W一U触发时_(d)采用cMlinux的cronQ配|时间的表示发出丰富  
  <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
 <property name="jobDetail" ref="jobDetail" />
 <property name="cronExpression" value="10 0/1 * * * ?" />
</bean>
  Cron表达?#8220;10 */1 * * * ?”意ؓ(f)Q从10U开始,?分钟执行一?/span> 
  
    W二U,采用比较话的方式Q申明gq时间和间隔旉
  <bean id="taskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
 <property name="jobDetail" ref="jobDetail" />
 <property name="startDelay" value="10000" />
 <property name="repeatInterval" value="60000" />
</bean>
  延迟10U启动,然后每隔1分钟执行一?/span> 

    6.开始调?br />
      <!-- 讄调度 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 <property name="triggers">
  <list>
   <ref bean="cronTrigger" />
  </list>
 </property>
 <property name="taskExecutor" ref="executor" />
</bean>

   7.l束Q启动容器即可,已经spring和quartzl合完毕?/strong>

    Cron常用的表辑ּ
    "0 0 12 * * ?" 每天中午12点触?/span>
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005q的每天上午10:15触发
"0 * 14 * * ?" 在每天下?点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下?点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下?点到2:55期间和下?点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下?点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下?:10?:44触发
"0 15 10 ? * MON-FRI" 周一臛_五的上午10:15触发
"0 15 10 15 * ?" 每月15日上?0:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6L 2002-2005" 2002q至2005q的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上?0:15触发

三:(x)quartz原理

    Ҏ(gu)上面spring的配|,我们比较清楚quartz的内部情况,下面我们主要详解配置涉及(qing)到的每个?/strong>
    1.我们先从最后一个步骤看PSchedulerFactoryBean Qscheduler的工厂实玎ͼ里面可以生出对应的多个jobDetail和triggerQ每个jobDetail对应trigger代表一个Q?br />         Quartz的SchedulerFactory是标准的工厂c,不太适合在Spring环境下用。此外,Z(jin)保证Scheduler能够感知 Spring容器的生命周期,完成自动启动和关闭的操作Q必让Scheduler和Spring容器的生命周期相兌。以便在Spring容器启动后, Scheduler自动开始工作,而在Spring容器关闭前,自动关闭Scheduler。ؓ(f)此,Spring提供 SchedulerFactoryBeanQ这个FactoryBean大致拥有以下的功能:(x) 
     1)以更具Bean风格的方式ؓ(f)Scheduler提供配置信息Q?nbsp;
     2)让Scheduler和Spring容器的生命周期徏立关联,相生相息Q?nbsp;
     3)通过属性配|部分或全部代替Quartz自n的配|文件?nbsp;
  2.jobDetail,表示一个可执行的业务调?br />  
  3.trigger:调度的时间计划,什么时候,每隔多少旉可执行等旉计划

  4.ThreadPoolTaskExecutorQ线E池Q用来ƈ行执行每个对应的jobQ提高效率,q也是上面提C推荐使用jdk自ntimer的一个很重要的原?/span>


陈睿 2012-07-03 14:42 发表评论
]]> վ֩ģ壺 ޾Ʒ߹ۿ| ĻƬ| Ļ| aëƬѸëƬƵ| ޹avһؼ| պ߹ۿ| һۺƵ| ƷAVһ| ߾ƷƵ| 1aëƬѹۿ| վ߹ۿ| ۺƵ߹ۿ| ùƵ| þĻƵ| 99Ů߹ۿ| þþŷղ| ޾Ʒ˿þ| ձһ| þóaëƬѹۿվ| ޳aƬ߹ۿ| ޹˳߹ۿ69վ| aëƬ߹ۿ| ѴƬ߹ۿyw| Դ߹ۿ| ޵һڶĵ| þþƷձľϣ| Ƶ߹ۿƵ| avһ | ȫԼƵ| 99ֻоƷѲ| һһˬһ߽дƵ| ˾þô߽ڹ| þ޾Ʒ| | Ʒһ| Ļ߾Ʒ| һƬaѲſ| һëƬ붯ѹۿ| þþþ޹AV鶹| Ļ޳AƬ | һ˿Ƶ|