ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久夜精品va视频免费观看,91嫩草亚洲精品,日本福利午夜视频在线http://www.aygfsteel.com/fish001118/展现自我åQŒæ”¾é£žç†æƒ»I¼zh-cnMon, 23 Jun 2025 22:27:58 GMTMon, 23 Jun 2025 22:27:58 GMT60设计模式之Factoryhttp://www.aygfsteel.com/fish001118/archive/2006/02/19/31561.html飞翔天空飞翔天空Sun, 19 Feb 2006 14:23:00 GMThttp://www.aygfsteel.com/fish001118/archive/2006/02/19/31561.htmlhttp://www.aygfsteel.com/fish001118/comments/31561.htmlhttp://www.aygfsteel.com/fish001118/archive/2006/02/19/31561.html#Feedback0http://www.aygfsteel.com/fish001118/comments/commentRss/31561.htmlhttp://www.aygfsteel.com/fish001118/services/trackbacks/31561.html板桥里äh åQˆè{载请保留åQ?/P>

工厂模式定义:提供创徏对象的接�

ä¸ÞZ½•使用?
工厂模式是我们最常用的模式了,著名的Jive论坛 ,ž®±å¤§é‡ä‹É用了工厂模式åQŒå·¥åŽ‚æ¨¡å¼åœ¨Java½E‹åº¾pȝ»Ÿå¯ä»¥è¯´æ˜¯éšå¤„可见ã€?/SPAN>

ä¸ÞZ»€ä¹ˆå·¥åŽ‚æ¨¡å¼æ˜¯å¦‚æ­¤å¸¸ç”¨åQŸå› ä¸ºå·¥åŽ‚æ¨¡å¼å°±ç›¸å½“äºŽåˆ›å»ºå®žä¾‹å¯¹è±¡çš„newåQŒæˆ‘们经常要æ ÒŽ®¾c»Class生成实例对象åQŒå¦‚A a=new A() 工厂模式也是用来创徏实例对象的,所以以后new时就要多个心çœû|¼Œæ˜¯å¦å¯ä»¥è€ƒè™‘实用工厂模式åQŒè™½ç„¶è¿™æ ·åšåQŒå¯èƒ½å¤šåšä¸€äº›å·¥ä½œï¼Œä½†ä¼š¾l™ä½ ¾pȝ»Ÿå¸¦æ¥æ›´å¤§çš„可扩展性和ž®½é‡ž®‘的修改量ã€?/SPAN>

我们以类Sampleä¸ÞZ¾‹åQ?如果我们要创建Sample的实例对è±?

Sample sample=new Sample();

可是åQŒå®žé™…情冉|˜¯åQŒé€šå¸¸æˆ‘们都要在创å»?SPAN lang=EN-US>sample实例时做点初始化的工ä½?比如赋å€?查询数据库等ã€?/SPAN>

首先åQŒæˆ‘们想到的是,可以使用Sample的构造函敎ͼŒ˜q™æ ·ç”Ÿæˆå®žä¾‹ž®±å†™æˆ?

Sample sample=new Sample(参数);

但是åQŒå¦‚果创å»?SPAN lang=EN-US>sampleå®žä¾‹æ—¶æ‰€åšçš„åˆå§‹åŒ–å·¥ä½œä¸æ˜¯è±¡èµ‹å€ÆD¿™æ ïL®€å•的事,可能是很长一ŒDµä»£ç ï¼Œå¦‚果也写入构造函æ•îC¸­åQŒé‚£ä½ çš„代码很难看了åQˆå°±éœ€è¦Refactor重整åQ‰ã€?/SPAN>

ä¸ÞZ»€ä¹ˆè¯´ä»£ç å¾ˆéš¾çœ‹ï¼Œåˆå­¦è€…可能没有这¿Uæ„Ÿè§‰ï¼Œæˆ‘们分析如下åQŒåˆå§‹åŒ–工作如果是很长一ŒDµä»£ç ï¼Œè¯´æ˜Žè¦åšçš„工作很多,ž®†å¾ˆå¤šå·¥ä½œè£…入一个方法中åQŒç›¸å½“于ž®†å¾ˆå¤šé¸¡è›‹æ”¾åœ¨ä¸€ä¸ªç¯®å­é‡ŒåQŒæ˜¯å¾ˆå±é™©çš„åQŒè¿™ä¹Ÿæ˜¯æœ‰èƒŒäº?SPAN lang=EN-US>Java面向对象的原则,面向对象的封è£?Encapsulation)和分‹z?Delegation)告诉我们åQŒå°½é‡å°†é•¿çš„代码分派“切剜y€æˆæ¯æ®µåQŒå°†æ¯æ®µå†â€œå°è£…”è“væ?减少ŒDµå’ŒŒDµä¹‹é—´å¶åˆè”¾pÀL€?åQŒè¿™æ øP¼Œž®×ƒ¼šž®†é£Žé™©åˆ†æ•£ï¼Œä»¥åŽå¦‚果需要修改,只要更改每段åQŒä¸ä¼šå†å‘生牵一动百的事情ã€?/SPAN>

在本例中åQŒé¦–先,我们需要将创徏实例的工作与使用实例的工作分开, 也就是说åQŒè®©åˆ›å¾å®žä¾‹æ‰€éœ€è¦çš„大量初始化工作从Sample的构造函æ•îC¸­åˆ†ç¦»å‡ºåŽ»ã€?/SPAN>

˜q™æ—¶æˆ‘们ž®±éœ€è¦?SPAN lang=EN-US>Factory工厂模式来生成对象了åQŒä¸èƒ½å†ç”¨ä¸Šé¢ç®€å•new Sample(参数)ã€?/SPAN>˜q˜æœ‰,如果Sample有个¾l§æ‰¿å¦‚MySample, 按照面向接口¾~–程,我们需要将Sample抽象成一个接å?现在Sample是接å?有两个子¾c»MySample å’ŒHisSample .我们要实例化他们æ—?如下:

Sample mysample=new MySample();
Sample hissample=new HisSample();

随着™å¹ç›®çš„æ·±å…?SPAN lang=EN-US>,Sample可能˜q˜ä¼š"生出很多儿子出来", 那么我们要对˜q™äº›å„¿å­ä¸€ä¸ªä¸ªå®žä¾‹åŒ?更糟¾p•çš„æ˜?可能˜q˜è¦å¯¹ä»¥å‰çš„代码˜q›è¡Œä¿®æ”¹:加入后来生出儿子的实ä¾?˜q™åœ¨ä¼ ç»Ÿ½E‹åºä¸­æ˜¯æ— æ³•避免çš?

但如果你一开始就有意识ä‹É用了工厂模式,˜q™äº›éºÈƒ¦ž®±æ²¡æœ‰äº†.

工厂æ–ÒŽ³•
你会建立一个专门生�SPAN lang=EN-US>Sample实例的工�

public class Factory{

  public static Sample creator(int which){

  //getClass 产生Sample 一般可使用动态类装蝲装入¾c…R€?BR>  if (which==1)
    return new SampleA();
  else if (which==2)
    return new SampleB();

  }

}

那么在你的程序中,如果要实例化Sampleæ—?ž®×ƒ‹Éç”?/SPAN>

Sample sampleA=Factory.creator(1);

˜q™æ ·,在整个就不涉及到Sample的具体子¾c?辑ֈ°ž®è£…效果,也就减少错误修改的机ä¼?˜q™ä¸ªåŽŸç†å¯ä»¥ç”¨å¾ˆé€šä¿—çš„è¯æ¥æ¯”å–?ž®±æ˜¯å…·ä½“事情做得­‘Šå¤š,­‘Šå®¹æ˜“范错误.˜q™æ¯ä¸ªåš˜q‡å…·ä½“工作的人都深有体会,相反,官做得越é«?说出的话­‘ŠæŠ½è±¡è¶Š½W¼ç»Ÿ,范错误可能性就­‘Šå°‘.好象我们从编½E‹åºä¸­ä¹Ÿèƒ½æ‚Ÿå‡ÞZh生道ç?呵呵.

使用工厂æ–ÒŽ³• 要注意几个角è‰ÔŒ¼Œé¦–先你要定义产品接口åQŒå¦‚上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory¾c»ï¼Œç”¨æ¥ç”Ÿæˆäº§å“SampleåQŒå¦‚下图åQŒæœ€åŒ™¾¹æ˜¯ç”Ÿäº§çš„对象SampleåQ?/P>

˜q›ä¸€æ­¥ç¨å¾®å¤æ‚一点,ž®±æ˜¯åœ¨å·¥åŽ‚ç±»ä¸Šè¿›è¡Œæ‹“å±•ï¼Œå·¥åŽ‚¾cÖM¹Ÿæœ‰ç‘ô承它的实现类concreteFactoryäº?B>ã€?/I>

抽象工厂
工厂模式中有: 工厂æ–ÒŽ³•(Factory Method) 抽象工厂(Abstract Factory).

˜q™ä¸¤ä¸ªæ¨¡å¼åŒºåˆ«åœ¨äºŽéœ€è¦åˆ›å»ºå¯¹è±¡çš„复杂½E‹åº¦ä¸Šã€‚如果我们创建对象的æ–ÒŽ³•变得复杂äº?如上面工厂方法中是创å»ÞZ¸€ä¸ªå¯¹è±¡Sample,如果我们˜q˜æœ‰æ–°çš„产品接口Sample2.

˜q™é‡Œå‡è®¾åQšSample有两个concrete¾c»SampleAå’ŒSamleBåQŒè€ŒSample2也有两个concrete¾c»Sample2Aå’ŒSampleB2

那么åQŒæˆ‘们就ž®†ä¸Šä¾‹ä¸­Factory变成抽象¾c?ž®†å…±åŒéƒ¨åˆ†å°è£…在抽象¾cÖM¸­,不同部分使用子类实现åQŒä¸‹é¢å°±æ˜¯å°†ä¸Šä¾‹ä¸­çš„Factory拓展成抽象工åŽ?

public abstract class Factory{

  public abstract Sample creator();

  public abstract Sample2 creator(String name);

}

public class SimpleFactory extends Factory{

  public Sample creator(){
    .........
    return new SampleA

  }

  public Sample2 creator(String name){
    .........
    return new Sample2A

  }

}

public class BombFactory extends Factory{

  public Sample creator(){
    ......
    return new SampleB

  }

  public Sample2 creator(String name){
    ......
    return new Sample2B
  }

}

 

从上面看åˆîC¸¤ä¸ªå·¥åŽ‚å„è‡ªç”Ÿäº§å‡ºä¸€å¥—Sampleå’ŒSample2,也许你会疑问åQŒäؓ什么我不可以ä‹É用两个工厂方法来分别生äñ”Sampleå’ŒSample2?

抽象工厂˜q˜æœ‰å¦å¤–一个关键要点,是因ä¸?SimpleFactory内,生äñ”Sample和生产Sample2的方法之间有一定联¾p»ï¼Œæ‰€ä»¥æ‰è¦å°†˜q™ä¸¤ä¸ªæ–¹æ³•捆¾l‘在一个类中,˜q™ä¸ªå·¥åŽ‚¾cÀLœ‰å…¶æœ¬íw«ç‰¹å¾ï¼Œä¹Ÿè®¸åˆ‰™€ è¿‡½E‹æ˜¯¾lŸä¸€çš„,比如åQšåˆ¶é€ å·¥è‰ºæ¯”较简单,所以名¿U°å«SimpleFactoryã€?/SPAN>

在实际应用中åQŒå·¥åŽ‚æ–¹æ³•ç”¨å¾—æ¯”è¾ƒå¤šä¸€äº›ï¼Œè€Œä¸”æ˜¯å’ŒåŠ¨æ€ç±»è£…å…¥å™¨ç»„åˆåœ¨ä¸€èµ·åº”ç”¨ï¼Œ

举例

我们ä»?SPAN lang=EN-US>Jiveçš„ForumFactoryä¸ÞZ¾‹åQŒè¿™ä¸ªä¾‹å­åœ¨å‰é¢çš„Singletonæ¨¡å¼ä¸­æˆ‘ä»¬è®¨è®ø™¿‡åQŒçŽ°åœ¨å†è®¨è®ºå…¶å·¥åŽ‚æ¨¡å¼?

public abstract class ForumFactory {

  private static Object initLock = new Object();
  private static String className = "com.jivesoftware.forum.database.DbForumFactory";
  private static ForumFactory factory = null;

  public static ForumFactory getInstance(Authorization authorization) {
    //If no valid authorization passed in, return null.
    if (authorization == null) {
      return null;
    }
    //以下使用了Singleton 单态模�BR>    if (factory == null) {
      synchronized(initLock) {
        if (factory == null) {
            ......

          try {
              //动态è{载类
              Class c = Class.forName(className);
              factory = (ForumFactory)c.newInstance();
          }
          catch (Exception e) {
              return null;
          }
        }
      }
    }

    //Now, ˜q”回 proxy.用来限制授权对forum的访é—?BR>    return new ForumFactoryProxy(authorization, factory,
                    factory.getPermissions(authorization));
  }

  //真正创徏forum的方法由¾l§æ‰¿forumfactory的子¾cÕdŽ»å®Œæˆ.
  public abstract Forum createForum(String name, String description)
  throws UnauthorizedException, ForumAlreadyExistsException;

  ....

}

 

 

å› äØ“çŽ°åœ¨çš?SPAN lang=EN-US>Jive是通过数据库系¾lŸå­˜æ”¾è®ºå›å¸–子等内容数据,如果希望更改为通过文äšg¾pȝ»Ÿå®žçް,˜q™ä¸ªå·¥åŽ‚æ–ÒŽ³•ForumFactoryž®±æä¾›äº†æä¾›åŠ¨æ€æŽ¥å?

private static String className = "com.jivesoftware.forum.database.DbForumFactory";

你可以ä‹É用自己开发的创徏forum的方法代替com.jivesoftware.forum.database.DbForumFactoryž®±å¯ä»?

在上面的一ŒDµä»£ç ä¸­ä¸€å…Þq”¨äº†ä¸‰¿Uæ¨¡å¼?SPAN lang=EN-US>,除了工厂模式å¤?˜q˜æœ‰Singleton单态模å¼?以及proxy模式,proxy模式主要用来授权用户对forum的访é—?å› äØ“è®‰K—®forum有两¿Uäh:一个是注册用户 一个是游客guest,那么那么相应的权限就不一æ ?而且˜q™ä¸ªæƒé™æ˜¯è¯½I¿æ•´ä¸ªç³»¾lŸçš„,因此建立一个proxy,¾cÖM¼¼¾|‘关的概å¿?可以很好的达到这个效æž?  

看看Java宠物店中的CatalogDAOFactory:

public class CatalogDAOFactory {

  /**

  * 本方法制定一个特别的子类来实现DAO模式ã€?BR>  * 具体子类定义是在J2EE的部¾|²æ˜q°å™¨ä¸­ã€?BR>  */

  public static CatalogDAO getDAO() throws CatalogDAOSysException {

    CatalogDAO catDao = null;

    try {

      InitialContext ic = new InitialContext();
      //动态装入CATALOG_DAO_CLASS
      //可以定义自己的CATALOG_DAO_CLASSåQŒä»Žè€Œåœ¨æ— éœ€å˜æ›´å¤ªå¤šä»£ç 
      //的前提下åQŒå®Œæˆç³»¾lŸçš„巨大变更ã€?/P>

      String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);

      catDao = (CatalogDAO) Class.forName(className).newInstance();

    } catch (NamingException ne) {

      throw new CatalogDAOSysException("
        CatalogDAOFactory.getDAO: NamingException while
          getting DAO type : \n" + ne.getMessage());

    } catch (Exception se) {

      throw new CatalogDAOSysException("
        CatalogDAOFactory.getDAO: Exception while getting
          DAO type : \n" + se.getMessage());

    }

    return catDao;

  }

}


CatalogDAOFactory是典型的工厂æ–ÒŽ³•åQŒcatDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类åQŒè¿™ä¸ªå®žçް子¾cÕdœ¨Java宠物店是用来操作catalog数据库,用户可以æ ÒŽ®æ•°æ®åº“çš„¾cÕdž‹ä¸åŒåQŒå®šåˆ¶è‡ªå·Þqš„具体实现子类åQŒå°†è‡ªå·±çš„子¾cÕd¾l™ä¸ŽCATALOG_DAO_CLASS变量ž®±å¯ä»¥ã€?/SPAN>

由此可见åQŒå·¥åŽ‚æ–¹æ³•ç¡®å®žäØ“¾pȝ»Ÿ¾l“构提供了非常灵‹zÕd¼ºå¤§çš„动态扩展机åˆÓž¼Œåªè¦æˆ‘们更换一下具体的工厂æ–ÒŽ³•åQŒç³»¾lŸå…¶ä»–地æ–ÒŽ— éœ€ä¸€ç‚¹å˜æ¢ï¼Œž®±æœ‰å¯èƒ½ž®†ç³»¾lŸåŠŸèƒ½è¿›è¡Œæ”¹å¤´æ¢é¢çš„å˜åŒ–ã€?/P>

]]>
新的博客åQŒä»Ž˜q™é‡Œå¼€å§‹ï¼http://www.aygfsteel.com/fish001118/archive/2006/02/19/31559.html飞翔天空飞翔天空Sun, 19 Feb 2006 14:19:00 GMThttp://www.aygfsteel.com/fish001118/archive/2006/02/19/31559.htmlhttp://www.aygfsteel.com/fish001118/comments/31559.htmlhttp://www.aygfsteel.com/fish001118/archive/2006/02/19/31559.html#Feedback0http://www.aygfsteel.com/fish001118/comments/commentRss/31559.htmlhttp://www.aygfsteel.com/fish001118/services/trackbacks/31559.html我懒得去写什么äh生感悟、生‹z»è¶£äº‹ã€‚说实在的,也没½IºåŽ»æƒŸë€‚æˆ‘çš„åšå®¢æ— éžæ˜¯ä¸ÞZº†è®°å½•一些åã^素在¾|‘上搜到的技术资料,以便自己查阅åQŒä¹Ÿå’Œå¤§å®¶ä¸€èµ·åˆ†äº«ã€‚之前在CSDN上有一个自å·Þqš„博客。没什么理由,ž®±æƒ³æ¢åˆ°˜q™è¾¹æ¥ã€‚。。。。。也可能是想找个阅读量大的地儿,呵呵åQå°±ä»Žä»Šå¤©å¼€å§‹å§åQ?/P>

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º »¯µÂÏØ| ÔªÄ±ÏØ| ÄÉÓºÏØ| ¿Ë¶«ÏØ| ¶àÂ×ÏØ| ½ðÏªÏØ| Á«»¨ÏØ| ÉñÄ¾ÏØ| ÒÇÕ÷ÊÐ| ʯÃÞÏØ| ³çÀñÏØ| ÉñÅ©¼ÜÁÖÇø| ÖîôßÊÐ| ÁÖÎ÷ÏØ| ÅíÔóÏØ| ¼ÃÔ´ÊÐ| ºÊÔóÊÐ| ÑôÐÅÏØ| ¾°µÂÕòÊÐ| ÓÀ´¨ÊÐ| »ªÄþÏØ| ¹ã°²ÊÐ| ¶¨ÄÏÏØ| ÉñÅ©¼ÜÁÖÇø| Áú¿ÚÊÐ| Ì«¹ÈÏØ| ÒËÁ¼ÏØ| ¹ÌÊ¼ÏØ| ²ýÀèÏØ| éŽ­ÏØ| ÅͰ²ÏØ| ´ó¹ØÏØ| аͶû»¢ÓÒÆì| ÕÃÎäÏØ| ³à±ÚÊÐ| ÑÓ³¤ÏØ| ËàÄÏ| ÂÞÔ´ÏØ| ʯÊ×ÊÐ| ´Ó½­ÏØ| Õòãä|