场景:
设想这样一种场景,有两种方式可以构造一个复数:第一种方式是通过实部和虚部的数字构造,第二中方式是通过半径和弧度构造,假设两种方式的参数类型都是float,不考虑精度问题。这样的话,因为参数类型相同,是不能通过一个构造函数体现的。即使可以将参数类型倒置来区分两种方式,但从开发人员的角度来考虑容易出现混乱。基于这种场景可以使用静态工厂方法代替构造函数。代码如下:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package effective.java;
/**
*
* @author huanghuankun
*/
public class Decimals {
private final float pre_data;//实部
private final float pst_data;//虚部
//注意:这里要设置为private
private Decimals(float pre_data, float pst_data) {
this.pre_data = pre_data;
this.pst_data = pst_data;
}
public static Decimals valueOf(float pre_data, float pst_data) {
return new Decimals(pre_data, pst_data);
}
public static Decimals getInstance(float num1, float num2) {
return new Decimals((float) num1 * Math.cos(num2), (float) num2 * Math.sin(num1));
}
}
下面对使用静态工厂方法代替构造函数的优缺点进行总结。
优点:
1.与构造函数不同,静态工厂方法有具体的名字,可以通过名字进行区分。
2.与构造函数不同,静态工厂方法不要求每次创建一个新的对象,在一定程度上节省了内存。
3.与构造函数不同,静态工厂方法通过接口来引用被返回的对象,而不是通过实现来引用,所以可以返回实现的子类型。
缺点:
1.类中如果没有public或protected类型的构造函数,不允许被继承。
2.静态工厂方法和其他静态方法一样,要求在API文档中作说明。所以不再特备需要的情况下,不建议使用。
注:这里所描述的静态工厂方法与设计模式中的静态工厂方法不是用一个概念。

本文探讨了在构造复数对象时使用静态工厂方法替代构造函数的方法,并分析了其优缺点。通过两个不同的静态工厂方法实现了根据实部和虚部或者半径和弧度来构造复数。

被折叠的 条评论
为什么被折叠?



