使用场景: 当你的各个子类的唯一差别只在“返回常量数据”的函数身上时,使用字段取代子类。
使用方法: 修改这些函数,使它们返回超类中的某个(新增)字段,然后销毁子类。
重构前:
public abstract class Person {
abstract boolean isMale();
abstract char getCode();
}
public class Male extends Person {
boolean isMale() {
return true;
}
char getCode() {
// TODO Auto-generated method stub
return 'M';
}
}
public class Female extends Person {
boolean isMale() {
return false;
}
char getCode() {
// TODO Auto-generated method stub
return 'F';
}
重构初步完成
public abstract class Person {
boolean _isMale;
char _code;
static Person createMale(){
return new Male();
}
static Person createFemale(){
return new Female();
}
boolean isMale(){
return _isMale;
}
public Person(boolean isMale, char code) {
// TODO Auto-generated constructor stub
_isMale = isMale;
_code = code;
}
public class Female extends Person {
public Female() {
super(false, 'F');
// TODO Auto-generated constructor stub
}
}
public class Male extends Person {
public Male() {
super(true, 'M');
// TODO Auto-generated constructor stub
}
}
最终重构完成 删除Female.class 和Male.class
public class Person {
private boolean _isMale;
private char _code;
static Person createMale(){
return new Person(true,'M');
}
static Person createFemale(){
return new Person(false,'F');
}
boolean isMale(){
return _isMale;
}
public Person(boolean isMale, char code) {
// TODO Auto-generated constructor stub
_isMale = isMale;
_code = code;
}
public static void main(String[] args) {
Person female = Person.createFemale();
System.out.println(female.isMale());
}
}