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

一、前言

从今天开始计划用一个月的时间,通过写读书笔记的方式来记录阅读这本Java领域经典中的经典书籍 - Effective Java过程中自己所思所想,以备以后查阅,同时分享出去也希望可以帮助到其他人,废话不多说,现在开始第一篇:创建和销毁对象。

二、考虑用静态工厂方法代替构造器

①. 一般我们有什么办法可以创建对象呢?

方法1: 使用类公有构造器。

方法2:使用类的静态方法返回一个实例。

②. 使用静态方法创建对象有什么优点?

优点1: 静态工厂方法的名字是由我们自己命名,而构造方法必须与类同名。

PrimeNumber primeNumber1 = new PrimeNumber(int Random); // 返回一个素数
PrimeNumber primeNumber2 = PrimeNumber.newInstance(); // 使用静态工厂方法表示更为清楚

优点2: 构造方法每次调用的时候都需要创建一个对象,而静态工厂方法每次调用的时候就不会创建一个新的对象,这对于一个要频繁创建对象的程序来说,可以极大的提高性能,单例模式就是这样实现的。

优点3: 静态工厂方法可以返回原返回类型的任何子类型的对象,这样使我们在选择返回对象的类时就有了更大的灵活性。

class Father {
    private Father() {
    }  

    public static Father newInstance(String type) {
        if (type.equals("ChildA")) { // 根据类型判断返回那个子类对象
            return new ChildA();
        } else {
            return new ChildB();
        }
    }  

    public void getName() {
        System.out.println("My name is father");
    }  

    private static class ChildA extends Father {
        public void getName() {
            System.out.println("My name is child A");
        }
    }  

    private static class ChildB extends Father {
        public void getName() {
            System.out.println("My name is child B");
        }
    }
}  

public class Test {
    public static void main(String[] args) {
        Father c1 = Father.newInstance("ChildA");
        c1.getName();
        Father c2 = Father.newInstance("ChildB");
        c2.getName();
    }
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/

优点4: 静态工厂方法在创建参数化类型实例的时候,可以使代码变得更加简洁。

private Map<String, List<String>> map = new HashMap<String, List<String>>();
public static <K, V> HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}

③. 使用静态工厂方法创建对象有什么缺点?

缺点1: 如果一个类只能通过静态工厂方法来获得实例,那么该类的构造函数就不能是共有的或受保护的,那么该类就不会有子类,即该类不能被继承。单例模式中首先要私有化构造器。

缺点2:静态工厂方法和其他静态方法从名字上看无法区分,所以我们可以约定静态工厂方法名字使用valueOf或者getInstance。

④. 什么时候用静态工厂方法,什么时候用构造器呢?

静态工厂方法和共有构造器各有用处,我们需要理解他们各自的长处,静态工厂通常更加合适,因此切忌第一反应就是提供公有的构造器,而不先考虑静态工厂。

作者:csdn博客 zdp072

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 静态
, 方法
, java静态方法
, public
, 构造器
, java伪静态
, 静态工厂
工厂
c 静态构造函数、静态构造函数、java 静态构造函数、php 静态类 构造函数、c 静态类 构造函数,以便于您获取更多的相关知识。

时间: 2024-08-08 22:47:53

Effective Java (1) 考虑用静态工厂方法代替构造器的相关文章

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

正文  静态工厂方法代替构造器 说起这个,好多可以念叨的.做了一年多的项目,慢慢也有感触. 说起构造器 大家很明白,构造器可以让我们在何处何地获取自身或者他人一个实例.我们是无忌惮的使用着 new 却从来没考虑过人家的感受.其实new ,new一个对象,就是开辟一块内存空间给这个对象.如果何处何地,都new的话,漫山遍野... 五颜六色的new ,本质却一样   一句话:构造器虽是万能,但是要珍惜. 再谈谈 静态工厂方法 静态工厂方法,顾名思义,只是一个返回类实例的静态方法.这里有个不切当的比喻

静态工厂方法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实例则完全一样.需要注意的是,当使用静态工厂方法

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

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

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

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

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

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

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

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

和我一起学Effective Java之创建和销毁对象

前言 主要学习创建和销毁对象: 1.何时以及如何创建对象 2.何时以及如何避免创建对象 3.如何确保它们能够适时地销毁 4.如何管理对象销毁之前必须进行的清理动作 正文 一.用静态工厂方法代替构造器 获取类的实例的常用方法有: 1.公有的构造器 2.公有的静态工厂方法 下面通过Boolean类(基本类型boolean的包装类)的简单示例来学习: //公有的构造器 public Boolean(String s) { this(parseBoolean(s)); } //公有的静态工厂方法 pub

《Effective Java》—— 创建与销毁对象

本篇主要总结的是<Effecticve Java>中关于创建和销毁对象的内容. 比如: 何时以及如何创建对象 何时以及如何避免创建对象 如何确保及时销毁 如何管理对象销毁前的清理动作 考虑用静态工厂方法代替构造器 使用静态工厂的优势: 有名称 不必每次调用的时候都创建一个新的对象 返回原返回类型的任何子类型对象 在创建参数化类型实例时,代码更加简洁. 使用静态工厂的缺点: 类如果不包含公有的或者受保护的构造器,就不能被子类化 与其他的静态方法实际上没有任何区别 举个例子: public cla