灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2284回复:0

Java学习笔记(一)考虑用静态工厂方法代替构造器

楼主#
更多 发布于:2012-09-08 09:39


静态工厂方法与构造器不同的第一大优势在于,它们有名称。
静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象。
静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象。
静态工厂方法的第四大优势在于,在创建参数化类型实例的时候,它们使代码变得更加简洁。


静态工厂方法的主要缺点在于,类如果不含有公有的或受保护的构造器,就不能被子类化。
静态工厂方法的第二个缺点在于,它们与去他的静态方法实际上没有任何区别。


服务提供者框架:
[java] // Service provider framework sketch - Service interface  

public interface Service {
    // Service-specific methods go here  
}
// Service provider framework sketch - Service interface
public interface Service {
    // Service-specific methods go here
}
[java] // Service provider framework sketch - Service provider interface  

public interface Provider {
    Service newService();
}
// Service provider framework sketch - Service provider interface
public interface Provider {
    Service newService();
}[java] // Service provider framework sketch  

// Noninstantiable class for service registration and access  

import java.util.*;
import java.util.concurrent.*;

public class Services {
    private Services() { }  // Prevents instantiation (Item 4)  

    // Maps service names to services  
    private static final Map<String, Provider> providers =
        new ConcurrentHashMap<String, Provider>();
    public static final String DEFAULT_PROVIDER_NAME = "<def>";

    // Provider registration API  
    public static void registerDefaultProvider(Provider p) {
        registerProvider(DEFAULT_PROVIDER_NAME, p);
    }
    public static void registerProvider(String name, Provider p){
        providers.put(name, p);
    }

    // Service access API  
    public static Service newInstance() {
        return newInstance(DEFAULT_PROVIDER_NAME);
    }
    public static Service newInstance(String name) {
        Provider p = providers.get(name);
        if (p == null)
            throw new IllegalArgumentException(
                "No provider registered with name: " + name);
        return p.newService();
    }
}
// Service provider framework sketch
// Noninstantiable class for service registration and access
import java.util.*;
import java.util.concurrent.*;
public class Services {
    private Services() { }  // Prevents instantiation (Item 4)
    // Maps service names to services
    private static final Map<String, Provider> providers =
        new ConcurrentHashMap<String, Provider>();
    public static final String DEFAULT_PROVIDER_NAME = "<def>";
    // Provider registration API
    public static void registerDefaultProvider(Provider p) {
        registerProvider(DEFAULT_PROVIDER_NAME, p);
    }
    public static void registerProvider(String name, Provider p){
        providers.put(name, p);
    }
    // Service access API
    public static Service newInstance() {
        return newInstance(DEFAULT_PROVIDER_NAME);
    }
    public static Service newInstance(String name) {
        Provider p = providers.get(name);
        if (p == null)
            throw new IllegalArgumentException(
                "No provider registered with name: " + name);
        return p.newService();
    }
}
[java] // Simple test program for service provider framework  

public class Test {
    public static void main(String[] args) {
        // Providers would execute these lines  
        Services.registerDefaultProvider(DEFAULT_PROVIDER);
        Services.registerProvider("comp",  COMP_PROVIDER);
        Services.registerProvider("armed", ARMED_PROVIDER);

        // Clients would execute these lines  
        Service s1 = Services.newInstance();
        Service s2 = Services.newInstance("comp");
        Service s3 = Services.newInstance("armed");
        System.out.printf("%s, %s, %s%n", s1, s2, s3);
    }

    private static Provider DEFAULT_PROVIDER = new Provider() {
        public Service newService() {
            return new Service() {
                @Override public String toString() {
                    return "Default service";
                }
            };
        }
    };

    private static Provider COMP_PROVIDER = new Provider() {
        public Service newService() {
            return new Service() {
                @Override public String toString() {
                    return "Complementary service";
                }
            };
        }
    };

    private static Provider ARMED_PROVIDER = new Provider() {
        public Service newService() {
            return new Service() {
                @Override public String toString() {
                    return "Armed service";
                }
            };
        }
    };
}


喜欢0 评分0
游客

返回顶部