改善JAVA代码01:考虑静态工厂方法代替构造器

正文 

 静态工厂方法代替构造器

    说起这个,好多可以念叨的。做了一年多的项目,慢慢也有感触。

 说起构造器

  大家很明白,构造器可以让我们在何处何地获取自身或者他人一个实例。我们是无忌惮的使用着 new 却从来没考虑过人家的感受。其实new ,new一个对象,就是开辟一块内存空间给这个对象。如果何处何地,都new的话,漫山遍野...

    

    五颜六色的new ,本质却一样

 

一句话:构造器虽是万能,但是要珍惜。

  再谈谈 静态工厂方法

    静态工厂方法,顾名思义,只是一个返回类实例的静态方法。这里有个不切当的比喻,我觉得静态工厂方法的好处,就像手龙头一样,一直有水(对象)。要就用这个方法呗。

  

看看下面的简单例子吧



 public  static Boolean valueOfBoolean(Boolean b)
 {
        return b ? Boolean.TRUE : Boolean.FALSE;
 }

 

  #boolean基本类型转换成Boolean对象引用。

  #static

 

  根据上面例子,相比构造器,大家和我一起讨论下:

    1 它开始有名称

    2 不必每次调用它们,创建一个新对象

    3 返回原返回类型的任何子类型的对象

 

服务访问API -----灵活的动态工厂

 

下面实现一个服务提供者接口和一个默认提供者:

package src.day01;

import java.util.concurrent.ConcurrentHashMap;

/**
 * Created with IntelliJ IDEA.
 * User: Li
 * Date: 14-5-12
 * Time: 下午10:52
 * To change this template use File | Settings | File Templates.
 */
public interface Service {
}

public interface Provider {
    Service newService();
}
public class Services {
    private Services(){}

    private static final Map<String , Provider> providers = new ConcurrentHashMap<String , Provider>();

    public static final String DEFAULT_PROVIDER_NAME = "<def>";
    public  static void registerDeafaultProvider(Provider p)
    {
        registerProvider(DEFAULT_PROVIDER_NAME,p);
    }
    public static void registerProvider(String name , Provider p)
    {
        providers.put(name,p);
    }

    public static Service new Instance()
    {
        return newInstance(DEFAULT_PROVIDER_NAME);
    }
    public static Service newInstance(String name )
    {
        Provider p = providers.get(name);
        if(p == null)
            throw new IllegalArgumentException(
                    "no..."
            );
        return p.newService();
    }
}

 

  #providers  

  # newInstance 该方法为静态工厂方法

 

  这个例子则告诉我们

    4 他们在创建参数化类型实例时候,代码更加简洁。

 

总结

  静态工厂方法

    1 它开始有名称

    2 不必每次调用它们,创建一个新对象

    3 返回原返回类型的任何子类型的对象

    4 他们在创建参数化类型实例时候,代码更加简洁。

    (生活离不开寻找对象,寻找方式,你说呢?)

时间: 2024-09-27 16:03:00

改善JAVA代码01:考虑静态工厂方法代替构造器的相关文章

Effective Java (1) 考虑用静态工厂方法代替构造器

一.前言 从今天开始计划用一个月的时间,通过写读书笔记的方式来记录阅读这本Java领域经典中的经典书籍 - Effective Java过程中自己所思所想,以备以后查阅,同时分享出去也希望可以帮助到其他人,废话不多说,现在开始第一篇:创建和销毁对象. 二.考虑用静态工厂方法代替构造器 ①. 一般我们有什么办法可以创建对象呢? 方法1: 使用类公有构造器. 方法2:使用类的静态方法返回一个实例. ②. 使用静态方法创建对象有什么优点? 优点1: 静态工厂方法的名字是由我们自己命名,而构造方法必须与

静态工厂方法VS构造器

原文链接 作者:Jose Luis 译者:yxiaomou 我之前已经介绍过关于构建者模式(Builder Pattern)的一些内容,它是一种很有用的模式用于实例化包含几个属性(可选的)的类,带来的好处是更容易读.写及维护客户端代码.今天,我将继续介绍对象创建技术. 在我看来,下面这个类是非常有用的例子.有一个RandomIntGenerator 类,产生随机的int类型的整数.如下所示: public class RandomIntGenerator { private final int

Spring使用静态工厂方法创建Bean

1. 使用静态工厂方法创建Bean     使用静态工厂方法创建Bean实例时,class属性也必须指定,但此时class属性并不是指定Bean实例的实现类,而是静态工厂类.因为Spring需要知道是用哪个工厂来创建Bean实例.另外,还需要使用factory-method来指定静态工厂方法名,Spring将调用静态工厂方法(可能包含一组参数),来返回一个Bean实例,一旦获得了指定Bean实例,Spring后面的处理步骤与采用普通方法创建Bean实例则完全一样.需要注意的是,当使用静态工厂方法

javascript-js中的java代码如何访问js中方法的参数??见图

问题描述 js中的java代码如何访问js中方法的参数??见图 如何让1处的值传到2处这里?? 解决方案 需要用ajax提交你的index到服务器,服务器端无法直接获取客户端js的变量值 <script src=""http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.1.min.js""></script><script type=""text/javascript&qu

Java设计模式编程中的工厂方法模式和抽象工厂模式_java

工厂方法模式 动机 创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展. 而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定义一个工厂接口,通过实现这个接口来决定实例化那个产品,这就是工厂方法模式,让类的实例化推迟到子类中进行. 目的 1. 定义一个接口,让子类决定实例化哪个产品. 2. 通过通用接口创建对象. 实现 1. 产品接口和具体产品很好理解. 2. 工厂类提供一个工厂方法,返回一个产品对象.但是这个工厂方法是

对《Java与模式》中工厂方法模式的异议

关于工厂方法的一点讨论,我们知道工厂方法属于类型创建模式,而抽象工厂属于对象创建模式,并且所谓的类创建模式就是把创建工作延迟到子类,而对象创建模式则将延迟到另一个对象. 并且设计模式中指出,类模式处理类和子类子间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来.对象模式则处理对象之间的关系,是动态的,运行时刻是可以变化的,更具动态性. 工厂方法由于属于类型创建模式,因此它的创建工作由子类完成,而不是使用对象进行创建,并且在<设计模式>中工厂方法的动机一节有一个示例,它的类大致如下:

Java使用设计模式中的工厂方法模式实例解析_java

工厂方法模式的定义工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 它包含了如下角色: 抽象产品(Product) 具体产品(ConcreteProduct) 抽象工厂(Factory) 具体工厂(ConcreteFactory) 模式的UML类

对比.net使用Java的匿名类对工厂方法模式提供更优雅的实现

工厂模式的意图: 定义一个用户创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 结构图: 场景: 这里制造两个手机product:Nokia.Motorola,为了制造这两个Product需要使用两个Creator(Factory)来制造它们.这两个Creator都有各自的Concreator(类似生产线).这两个手机都实现必须实现两个最基本的功能:call(打电话).photo(拍照). product: /// <summary> ///

java代码-Scnner类的next()方法,返回的值为什么在比较前需要toString一下

问题描述 Scnner类的next()方法,返回的值为什么在比较前需要toString一下 Scanner input = new Scanner(System.in); System.out.println("请输入预测结果:花/数字"); String result = input.next(); System.out.println("接收的字符串:"+result); //生成随机数(偶数为花/奇数为数字) String res = ""