zoukankan      html  css  js  c++  java
  • 简单工厂模式(静态工厂方法模式)【设计模式】

    定义:提供一个创建实例的功能,客户端使用者无需关心实例的具体实现。被创建实例可以是接口、抽象类,也可以是具体的类。它又称为静态工厂方法(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
     
  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/ttylinux/p/4575703.html
Copyright © 2011-2022 走看看