创建和销毁对象--考虑用静态工厂方法代替构造器
import java.util.HashMap;
import java.util.Map;
/**
* @author Yoko
* 《Effective Java》第二版:
* 创建和销毁对象
* 第一条:考虑用静态工厂方法代替构造器
* 优点: 1.静态工厂方法都可以有自己的名称
* 2.不必再每次调用它们的时候都创建一个新对象
* 3.可以返回类型的任何子类型的对象
* 4.在创建参数化类型实例的对象,使代码变的更加简洁
* 缺点: 1.类中如果不含有公有或者受保护的构造器,就不能被子类化,不能被继承
* 2.其实静态工厂方法与其他的静态方法没有区别
*/
class Animal {
/*
* 使用静态工厂方法对于构造器的优势之:
* 通过静态工厂方法返回实例对象,并且是返回同一个实例对象。不必再每次调用的时候都创建一个新对象。
*
*/
private static Animal animal = new Animal();
public static Animal getInstance(){
return animal;
}
/*
* 使用静态工厂方法对于构造器的优势之:
* 都可以存在不同的名称,用于获取不同的实例对象
*/
private String color = null;
private String Varieties = null;
public Animal() {
}
public Animal(String color, String varieties) {
this.color = color;
this.Varieties = varieties;
}
//获取只含有颜色属性的动物信息
public static Animal getOnlyColorAnimal(String color){
return new Animal(color, null);
}
//获取只含有品种属性的动物信息
public static Animal getOnlyVarietiesAnimal(String varieties){
return new Animal(null, varieties);
}
//获取含有所有属性的动物信息
public static Animal getAnimal(String color, String varieties){
return new Animal(color, varieties);
}
/*
* 使用静态工厂方法对于构造器的优势之:
* 可以返回原返回类型的任何子类型的对象,但是父类必须含有public或者protect修饰的构造方法,
* 否则子类不可以继承父类。
*/
public static AnimalTest getInstance1(){
return new Dog();
}
/*
* 使用静态工厂方法对于构造器的优势之:
* 在创建参数化类型实例的时候,可以使代码更加简洁。
*/
public static <K,V> HashMap<K, V> newInstance(){
return new HashMap<K,V>();
}
}
class Dog extends AnimalTest {
public void call(){
System.out.println("狗狗会汪汪叫");
}
}