简单工厂模式(静态工厂方法模式)【设计模式】

定义:提供一个创建实例的功能,客户端使用者无需关心实例的具体实现。被创建实例可以是接口、抽象类,也可以是具体的类。它又称为静态工厂方法(Static Factory Method)模式

 
简单工厂模式的作用,优点:为客户端屏蔽所需要的实例的具体实现,客户端只需关注某个接口便可,无需关注实现。具体实现被封装起来客户端和具体实现解耦,客户端只需关注接口,接口的实现变化对客户端没有影响。总结起来,就是封装功能,封转实例的具体实现;解耦功能,接口实现的变化影响不了客户端。
 
 
例子:
 
例子1:不带参数
没有参数传给工厂方法,工厂方法只返回一种类型的实现,不使用参数选择实现。
public class DbConnection 
   private static final int MAX_CONNS = 100;
   private static int totalConnections = 0;
 
   private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();
 
   private DbConnection() 
   { 
     // ... 
     totalConnections++;
   } 
 
   public static DbConnection getDbConnection() 
   { 
     if(totalConnections < MAX_CONNS)
     { 
       return new DbConnection(); 
     } 
 
     else if(availableConnections.size() > 0)
     { 
         DbConnection dbc = availableConnections.iterator().next();
         availableConnections.remove(dbc);
         return dbc;
     } 
     else { 
       throw new NoDbConnections(); 
     } 
   } 
 
   public static void returnDbConnection(DbConnection dbc)
   { 
     availableConnections.add(dbc);
     //... 
   } 
 
 
     例子2:带参数,选择具体实现
     简单工厂方法有传入参数,使用传入参数来确定实现。这种方式,暴露了一定的内部实现细节,因为客户端,要理解参数的含义,才可以正确使用简单工厂方法。而参数的含义,是跟具体实现有关系的,用参数来选择某个具体实现。
     
public interface Api {
 
  public void testOne();
 
}
 
public class ImplApi implements Api{
 
  public void testOne()
  {
    System. out.println( "This is ImplApi." );
  }
 
}
 
public class ImplTwoApi implements Api {
 
  public void testOne()
  {
    System. out.println( "This is ImplTwoApi." );
  }
 
}
 
public class TypeConstants {
 
  public static final int TypeOne =1;
  public static final int TypeTwo =2;
 
 
}
 
public class ApiFactory {
 
 
  /**
   * @param type  the value  must in TypeConstants
   * @throws Exception
   *
   */
  public static Api createApi( int type) throws Exception
 {
  
  
      switch(type)
      {
        case TypeConstants. TypeOne:
          return new ImplApi();
         
         
        case TypeConstants. TypeTwo:
          return new ImplTwoApi();
         
         default :
           throw new Exception( "Unsupoorted param exception");
      }
 }
 
}
 
 
客户端,需要理解传入参数的含义,这在一定程度上暴露了工厂方法的内部实现。
public class Client {
 
 
  public static void main(String[] args)
  {
    try {
      Api one = ApiFactory. createApi(TypeConstants. TypeOne);
      one.testOne();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
   
   
  }
 
}
 
     例子3:需要传入参数,具体实现是通过读取配置文件或者依赖注入来实现,也就是说,实现方式的职责委托到其它部件。 这样可以避免,不断往工厂方法中添加实现代码。
 
引用资料:
http://stackoverflow.com/questions/929021/what-are-static-factory-methods-in-java
 
原文地址:https://www.cnblogs.com/ttylinux/p/4575703.html