工厂方法模式(重要):
又叫工厂模式或多态工厂,工厂父类负责定义具体实例化类的公共接口,工厂子类负责生成具体的实例化对象,目的是将实例化操作交给工厂子类完成,在程序运行时再确定具体工厂子类的类型,用子类对象覆盖父类对象
工厂模式的使用环境:
1.不需要知道要实例化对象的类名,不关心对象创建的细节,只需要知道其对应的具体工厂类
2.使用多态机制和里氏代换原则,将对象的创建交给具体工厂子类,在程序运行时再确定具体工厂子类的类型,用子类对象覆盖父类对象
工厂方法的优点:
1.将对象的创建和使用分离,不关心对象创建的细节,不需要知道要创建类的类名
2.当加入新的类时,无须修改原有的代码,只需要增加新类和具体工厂类即可,符合开闭原则
工厂方法的缺点:
1.增加新类时,系统中类的个数成对增加,增加了系统的复杂度
2.引入了抽象层,增加了系统的抽象性和理解难度
工厂方法模式例子:
要实例化类的父接口
public interface Animal {
void eat();
}
要实例化的Dog类
public class Dog implements Animal{
/**
* @Description: TODO
* @author doudou
* @date 2019年10月6日
* @throws
* @return
* @see creation.SimpleFactoryPattern.Animal#eat()
*/
@Override
public void eat() {
System.out.println("小狗吃骨头。。。");
}
}
要实例化的Cat类
public class Cat implements Animal{
/**
* @Description: TODO
* @author doudou
* @date 2019年10月6日
* @throws
* @return
* @see creation.SimpleFactoryPattern.Animal#eat()
*/
@Override
public void eat() {
System.out.println("小猫吃鱼。。。");
}
}
抽象工厂父接口
public interface AnimalFactory {
Animal getAnimal();
}
具体工厂DogFactory类
public class DogFactory implements AnimalFactory{
/**
* @Description: TODO
* @author doudou
* @date 2019年10月7日
* @return
* @throws
* @return
* @see creation.FactoryMethodPattern.AnimalFactory#getAnimal()
*/
@Override
public Animal getAnimal() {
return new Dog();
}
}
具体工厂CatFactory类
public class CatFactory implements AnimalFactory{
/**
* @Description: TODO
* @author doudou
* @date 2019年10月7日
* @return
* @throws
* @return
* @see creation.FactoryMethodPattern.AnimalFactory#getAnimal()
*/
@Override
public Animal getAnimal() {
return new Cat();
}
}