第1条:考虑用静态工厂方法代替构造器

来源:互联网 发布:linux gosu 编辑:程序博客网 时间:2024/06/07 03:32
几大优势: 
静态工厂方法与构造器不同的第一大优势在于,他们有名称。 


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


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

demo:

view plaincopy to clipboardprint?
  1. // Service provider framework sketch - Service interface - Page 12  
  2.   
  3. public interface Service {  
  4.     // Service-specific methods go here  
  5. }  
view plaincopy to clipboardprint?
  1. // Service provider framework sketch - Service provider interface - Page 12  
  2.   
  3. public interface Provider {  
  4.     Service newService();  
  5. }  
view plaincopy to clipboardprint?
  1. // Service provider framework sketch  
  2.   
  3. // Noninstantiable class for service registration and access - Pages 8-9  
  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. }  
view plaincopy to clipboardprint?
  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.     };  
  46. }  
静态工厂方法与构造器不同的第四大优势在于,在创建参数化类型实例的时候,他们使代码变得更加简洁。 


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


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