Android 编码规范:(一)考虑用静态工厂方法代替构造器

对于类而言,为了让客户端获取它自身的一个实例,最常用的方法就是提供一个公有的构造器。类也可以提供一个公有的静态工厂方法,它只是一个返回类的实例的静态方法。下面是一个来自Boolean的简单示例。

  1. public static Boolean valueOf(boolean b) {  
  2.     return b ? Boolean.TRUE : Boolean.False;  
  3. }  

静态工厂方法与构造器不同的第一大优势在于,它们有名称。

静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象。

静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象。

静态工厂方法的第四大优势在于,在创建参数化类型实例的时候,它们使代码变得更加简洁。


静态工厂方法的主要缺点在于,类如果不含有公有的或受保护的构造器,就不能被子类化。

静态工厂方法的第二个缺点在于,它们与去他的静态方法实际上没有任何区别。


服务提供者框架:

  1. // Service provider framework sketch - Service interface   
  2.   
  3. public interface Service {  
  4.     // Service-specific methods go here  
  5. }  
  1. // Service provider framework sketch - Service provider interface   
  2.   
  3. public interface Provider {  
  4.     Service newService();  
  5. }  
  1. // Service provider framework sketch  
  2.   
  3. // Noninstantiable class for service registration and access   
  4.   
  5. import java.util.*;  
  6. import java.util.concurrent.*;  
  7.   
  8. public class Services {  
  9.     private Services() { }  // Prevents instantiation (Item 4)  
  10.   
  11.     // Maps service names to services  
  12.     private static final Map<String, Provider> providers =  
  13.         new ConcurrentHashMap<String, Provider>();  
  14.     public static final String DEFAULT_PROVIDER_NAME = "<def>";  
  15.   
  16.     // Provider registration API  
  17.     public static void registerDefaultProvider(Provider p) {  
  18.         registerProvider(DEFAULT_PROVIDER_NAME, p);  
  19.     }  
  20.     public static void registerProvider(String name, Provider p){  
  21.         providers.put(name, p);  
  22.     }  
  23.   
  24.     // Service access API  
  25.     public static Service newInstance() {  
  26.         return newInstance(DEFAULT_PROVIDER_NAME);  
  27.     }  
  28.     public static Service newInstance(String name) {  
  29.         Provider p = providers.get(name);  
  30.         if (p == null)  
  31.             throw new IllegalArgumentException(  
  32.                 "No provider registered with name: " + name);  
  33.         return p.newService();  
  34.     }  
  35. }  

  1. // Simple test program for service provider framework  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         // Providers would execute these lines  
  6.         Services.registerDefaultProvider(DEFAULT_PROVIDER);  
  7.         Services.registerProvider("comp",  COMP_PROVIDER);  
  8.         Services.registerProvider("armed", ARMED_PROVIDER);  
  9.   
  10.         // Clients would execute these lines  
  11.         Service s1 = Services.newInstance();  
  12.         Service s2 = Services.newInstance("comp");  
  13.         Service s3 = Services.newInstance("armed");  
  14.         System.out.printf("%s, %s, %s%n", s1, s2, s3);  
  15.     }  
  16.   
  17.     private static Provider DEFAULT_PROVIDER = new Provider() {  
  18.         public Service newService() {  
  19.             return new Service() {  
  20.                 @Override public String toString() {  
  21.                     return "Default service";  
  22.                 }  
  23.             };  
  24.         }  
  25.     };  
  26.   
  27.     private static Provider COMP_PROVIDER = new Provider() {  
  28.         public Service newService() {  
  29.             return new Service() {  
  30.                 @Override public String toString() {  
  31.                     return "Complementary service";  
  32.                 }  
  33.             };  
  34.         }  
  35.     };  
  36.   
  37.     private static Provider ARMED_PROVIDER = new Provider() {  
  38.         public Service newService() {  
  39.             return new Service() {  
  40.                 @Override public String toString() {  
  41.                     return "Armed service";  
  42.                 }  
  43.             };  
  44.         }  
  45.     };  


posted @ 2012-05-28 14:03  andriod2012  阅读(453)  评论(0编辑  收藏  举报