设计模式之Factory

来源:互联网 发布:预算软件免费下载 编辑:程序博客网 时间:2024/04/29 20:20

前段时间就注意过现在做的软件里面好多都是getInstance() 方法获得实例,终于有时间深入研究一番。 嘿嘿

工厂方法确实为统结构提供了非常灵活大的动态扩展机制,只要我一下具体的工厂方法,系其他地方无需一点变换,就有可能将系功能行改头换面的化。

工厂模式在Java程序系可以是随工厂模式是如此常用?因工厂模式就相当于象的new,我们经常要根据Class生成象,如A a=new A() 工厂模式也是用来象的,所以以后new就要多个心眼,是否可以考虑实用工厂模式这样做,可能多做一些工作,但会你系统带来更大的可展性和尽量少的修改量。在整个就不及到具体子,达到封装效果,也就减少错误修改的机会,个原理可以用很通俗的来比:就是具体事情做得越多,越容易范错误.这每个做具体工作的人都深有体会,相反,官做得越高,出的越抽象越笼统,错误可能性就越少.好象我程序中也能悟出人生道理?嘿嘿!~ ~

使用工厂方法 要注意几个角色,首先你要定义产品接稍微复杂一点,就是在工厂行拓展,工厂也有承它的实现类concreteFactory

抽象工厂
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).

两个模式区在于需要象的复杂程度上

1

Factory成抽象,将共同部分封装在抽象,不同部分使用子类实现,下面就是将上例中的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
  }

}

从上面看到两个工厂各自生出一套SampleSample2,你会疑我不可以使用两个工厂方法来分SampleSample2?

抽象工厂有另外一个关键要点,是因 SimpleFactory内,生Sample和生Sample2的方法之有一定系,所以才要将两个方法捆在一个中,个工厂有其本身特征,也制造程是一的,比如:制造工较简单,所以名称叫SimpleFactory

实际应用中,工厂方法用得比多一些,而且是和动态类装入器合在一起

2

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 单态模式
    if (factory == null) {
      synchronized(initLock) {
        if (factory == null) {
            ......

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

    //Now, 返回 proxy.用来限制授权对forum访问
    return new ForumFactoryProxy(authorization, factory,
                    factory.getPermissions(authorization));
  }

  //真正forum的方法由forumfactory的子去完成.
  public abstract Forum createForum(String name, String description)
  throws UnauthorizedException, ForumAlreadyExistsException;

  ....

}

上面的一段代中一共用了三模式,除了工厂模式外,Singleton单态模式,以及proxy模式,proxy模式主要用来授户对forum访问,为访问forum有两:一个是注册用 一个是游客guest,限就不一,而且限是穿整个系,因此建立一个proxy,似网的概念,可以很好的达到个效果.  

3

public class CatalogDAOFactory {

  /**

  * 本方法制定一个特的子实现DAO模式。
  * 具体子是在J2EE的部署描述器中。
  */

  public static CatalogDAO getDAO() throws CatalogDAOSysException {

    CatalogDAO catDao = null;

    try {

      InitialContext ic = new InitialContext();
      //动态装入
CATALOG_DAO_CLASS
      //可以定自己的CATALOG_DAO_CLASS,从而在无需更太多代

      //的前提下,完成系的巨大更。

      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是典型的工厂方法,catDao是通过动态类装入器classNameCatalogDAOFactory具体实现实现Java物店是用来操作catalog数据可以根据数据型不同,定制自己的具体实现,将自己的子CATALOG_DAO_CLASS量就可以

原创粉丝点击