《Effective Java》学习笔记-01

创建和销毁对象--考虑用静态工厂方法代替构造器

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("狗狗会汪汪叫");
	}
}

猜你喜欢

转载自blog.csdn.net/yhy_it/article/details/80911386