Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 313|回复: 0

[Java基础知识]用静态工厂方法代替构造器

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 17:43:09 | 显示全部楼层 |阅读模式
    于类而言,为了让客户端获取它自身的一个实例,最常用的方法就是提供一个公有的构造器。类也可以提供一个公有的静态工厂方法,它只是一个返回类的实例的静态方法。下面是一个来自Boolean的简单示例。  public static Boolean valueOf(boolean b) {
         return b ? Boolean.TRUE : Boolean.False;
    }  (1)静态工厂方法与构造器不同的第一大优势在于,它们有名称

    (2)静态工厂方法与构造器不同的第二大优势在于,不必在每次调

    (3)用它们的时候都创建一个新对象。
    静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象。

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

         
       

         
       
      
    静态工厂方法的主要缺点在于,类如果不含有公有的或受保护的构造器,就不能被子类化。
    静态工厂方法的第二个缺点在于,它们与去他的静态方法实际上没有任何区别。 服务提供者框架:
    1. public interface Service { //要提供的服务
    2.     // Service-specific methods go here  
    3. }
    4. public interface Provider { //服务提供者要实现的接口
    5.     Service newService();
    6. }
    7. import java.util.*;
    8. import java.util.concurrent.*;

    9. public class Services {
    10.     private Services() { }  

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

    14.     // Provider registration API  
    15.     public static void registerDefaultProvider(Provider p) {
    16.         registerProvider(DEFAULT_PROVIDER_NAME, p);
    17.     }
    18.     public static void registerProvider(String name, Provider p){
    19.         providers.put(name, p);
    20.     }

    21.     // Service access API  
    22.     public static Service newInstance() {
    23.         return newInstance(DEFAULT_PROVIDER_NAME);
    24.     }
    25.     public static Service newInstance(String name) {
    26.         Provider p = providers.get(name);
    27.         if (p == null)
    28.             throw new IllegalArgumentException(
    29.                 "No provider registered with name: " + name);
    30.         return p.newService();
    31.     }
    32. }

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

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

    45.     private static Provider DEFAULT_PROVIDER = new Provider() {
    46.         public Service newService() {
    47.             return new Service() {
    48.                 @Override public String toString() {
    49.                     return "Default service";
    50.                 }
    51.             };
    52.         }
    53.     };

    54.     private static Provider COMP_PROVIDER = new Provider() {
    55.         public Service newService() {
    56.             return new Service() {
    57.                 @Override public String toString() {
    58.                     return "Complementary service";
    59.                 }
    60.             };
    61.         }
    62.     };

    63.     private static Provider ARMED_PROVIDER = new Provider() {
    64.         public Service newService() {
    65.             return new Service() {
    66.                 @Override public String toString() {
    67.                     return "Armed service";
    68.                 }
    69.             };
    70.         }
    71.     };
    72. }

    复制代码
    运行:
    C:ex>java Test
    Default service, Complementary service, Armed service




      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 16:41 , Processed in 0.361736 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表