`
ghostcloud
  • 浏览: 1780 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

1、使用构造方法前考虑一下静态工厂方法

阅读更多

使用构造方法前考虑一下静态工厂方法

 

请注意,这里所说的工厂方法和设计模式中所说的工厂方法是不同的,这里说的静态工厂方法例如:

public static User getUserInstance(){
    return new User();
}

如此看来和普通的构造方法没有什么区别,但仔细分析有以下四个优点:
1、静态工厂方法是有名字的,这一点对于提高开发效率至关重要。
    将上面的例子延伸,如果User类有两个构造方法User(String id)和User(String name,String status),那么在构造User对象时就容易发生混淆。而使用静态工厂方法就避免了这种误会,如:

public static User getUserById(String id){
    return new User(id);
}
public static User getUserByNameStatus(String name,String status){
    return new User(name,status);
}

2、可以实现单体访问,举个例子说明:

public class ConfigFactory{
    private static SystemConfig sc = null;
    public static SystemConfig getSystemConfig(){
        if(sc==null)
            sc = new SystemConfig();
        return sc;
    }
}

3、静态工厂方法返回的对象可以是定义的类,也可以是其子类,这是构造函数做不到的,不用举例子了。

4、使用静态工厂方法优化泛型使用,减少代码重复,一般情况下,我们使用泛型采用:

Map<String, List<String>> m = new HashMap<String, List<String>>();

的方式,使用静态工厂方法,我们可以写成:

public static <K, V> HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}

调用的时候,直接使用:

Map<String, List<String>> m = HashMap.newInstance();

即可。

可惜的是,截至JDK1.6为止,HashMap也没有提供这种方法,我们只能将此写在自己的工具类里。

 

当然这样做也不是有百利而无一害的,缺点是:

1、如果我们将一个类的构造方法指定为私有,只对外提供一个静态工厂方法的话,这个类将是无法继承的。

2、静态工厂方法将和普通方法在一起出现在javadoc中,而不会像构造方法一样被单独展示在一起,这样会造成文档阅读的不便。

 

上述介绍,不是让您在创建类时,摒弃构造方法,只使用静态工厂方法,而是让您在使用构造方法前,多考虑一种静态工厂方法的实现方式。而已。   

分享到:
评论

相关推荐

    yuchuangu85#Develop-Source#01. 考虑使用静态工厂方法替代构造方法1

    声明的返回类型的任何子类都是允许的。返回对象的类也可以随每次发布而不同。EnumSet 类(详见第 36 条)没有公共构造方法,只有静态工厂。在 OpenJDK

    jonykchen#effective-java-3rd-chinese#01. 考虑使用静态工厂方法替代构造方法1

    声明的返回类型的任何子类都是允许的。返回对象的类也可以随每次发布而不同。EnumSet 类(详见第 36 条)没有公共构造方法,只有静态工厂。在 OpenJDK

    Java中构造方法被别封装后的调用.docx

    如果希望从其他类中创建此类的对象,可以考虑使用静态工厂方法或单例模式等设计模式。这种做法不仅保持了封装性,而且提高了代码的可读性和可维护性。总之,封装是一种重要的设计原则,它有助于确保类的行为和状态...

    effective-java.pdf

    1. 静态工厂方法与构造方法的区别 在Java中,获取类的实例通常是通过构造方法来实现的。然而,除了构造方法,我们还可以通过静态工厂方法来获取实例。静态工厂方法是一个简单的方法,它返回类的实例。例如,Boolean...

    effective Java(第3版)各章节的中英文学习参考(已完成).zip

    目录(Contents)第 2 章 创建和销毁对象(创建和气氛对象)第二章简介(章节介绍)第 1 条考虑静态工厂方法而不是构造函数(考虑以静态工厂方法代替构造函数)Item 2: 当面对许多构造函数参数时考虑构建器(在面对...

    小组学习:使用构造函数

    2. 如果多个构造函数有重复的代码,可以考虑使用初始化器或者私有的辅助方法来避免代码重复。 3. 避免在构造函数中抛出异常,因为这会导致对象的创建失败,而且很难捕获和处理。 五、工厂方法和构造函数 在某些...

    Effective-Java读书笔记(上)

    2. **使用静态工厂方法**:如果一个类既提供了静态工厂方法也提供了构造器,则通常推荐使用静态工厂方法来创建对象,以减少不必要的对象创建。 通过以上讨论可以看出,使用静态工厂方法不仅可以让代码更加简洁易懂...

    java高效编程[参照].pdf

    这里主要讨论了两种方式:使用构造函数和静态工厂方法。 首先,静态工厂方法在某些情况下优于构造函数。其优势在于: 1. 静态工厂方法具有命名,这使得方法调用更具描述性,提高了代码的可读性。例如,`getInstance...

    简单工厂模式

    1. **静态工厂方法**:通常情况下,工厂类会包含一个或多个静态工厂方法,而不是构造函数。 2. **灵活性**:如果产品之间的关系比较复杂,或者产品类需要传递一些初始化参数,简单工厂模式可能无法满足需求,这时...

    5-4 习题课z可复用与可维护构造技杯1

    故在Parkable 中使用静态工厂方法,new 操作改为: Parkable parkable = Parkable.create(plate, width); 5. 设计 Motor、Plane 类,实现 Parkable 接口。但是,Car、Motor、Plane 的共性 rep和方法是重复的,可以...

    C#私有构造函数使用示例

    - 提供一个静态工厂方法(如`CreatePcc()`)来控制实例的创建,这在单例模式中尤其重要。 在示例代码中,`PrivateConClass`的`Main`方法展示了如何使用类的静态方法和单例实例。`pcc = PrivateConClass.CreatePcc()...

    Java-code-security.rar_java security

    6. **初始化静态集合**:确保静态集合在使用前已初始化,并考虑使用不可变集合。 7. **正确管理静态随机数生成器**:使用线程安全的随机数生成器,并避免共享状态。 8. **线程安全设计**:对静态方法进行线程安全...

    JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)

    如果产品类数量庞大或者需要动态决定创建哪种产品,可以考虑使用更复杂的工厂模式,如工厂方法模式或抽象工厂模式。 总的来说,简单工厂模式提供了一种便捷的创建对象的方式,减少了客户端与具体实现之间的耦合。...

    利用java反射原理实现工厂模式

    在这个例子中,`ReflectionFactory`是一个静态工厂,接收一个类名字符串,然后返回对应类的新实例。这种方式使得我们可以在不修改工厂类的情况下,增加新的产品类。 虽然反射提供了很大的灵活性,但也有其缺点,如...

    Joshua Bloch 所著《Effective Java 第二版》一书摘要.zip

    使用静态工厂方法代替构造函数2. 当面对许多构造函数时使用BUILDERS3. 使用私有构造函数或枚举类型强制执行单例属性4. 使用私有构造函数来强制实现不可实例化5. 避免创建对象6. 消除过时的对象引用7. 避免使用 ...

    反射技术+简单工厂模式

    简单工厂模式是一种创建型设计模式,它提供了一个静态工厂方法来创建对象,而无需指定具体的产品类。这个方法可以根据输入的参数或者特定条件来决定实例化哪个类的对象。简单工厂模式的主要优点在于降低了客户端代码...

    Effactive java(english pdf)

    4. **优先考虑静态工厂方法而非构造器**: 静态工厂方法有多个优势,例如可以有选择性地返回子类实例、不需暴露构造器、在无参数情况下避免创建不必要的对象等。 5. **使用不可变对象**: 不可变对象一旦创建完成,其...

    1_Effective_Java_2nd_Edition_proglib_java_Joshua_

    8. **静态工厂方法与构造器**:书中分析了两者的优劣,指出静态工厂方法在某些情况下比构造器更灵活,如隐藏类的创建,控制实例数量等。 9. **序列化**:针对Java的序列化机制, Bloch提出了一些注意事项,如实现...

Global site tag (gtag.js) - Google Analytics