意义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
使用场景:当创建一个对象的逻辑非常复杂时,可以使用工厂模式将创建对象的逻辑封装起来,需要用到该对象时直接从工厂类获取,而不是去new一个对象再进行繁杂的配置。或者一个接口下有很多的子类,创建这些子类对象时,只需要知道名称,就可以通过工厂类创建子类,采用多态的方式获取子类的引用。
/**
*创建一个接口Animal
* @author admin
*
*/
public interface Animal {
void eat();
}
子类实现Animal接口
public class Cat implements Animal {
@Override
public void eat() {
System.out.println("cat is eating");
}
}
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("dog is eating");
}
}
public class Pig implements Animal {
@Override
public void eat() {
System.out.println("pig is eating");
}
}
定义工厂类:
public class AnimalFactory {
/**
* 根据传入的名称,创建不同动物的实例
* @param name
* @return
*/
public Animal getAnimal(String name){
if(name==null){
return null;
}else if(name.equalsIgnoreCase("cat")){
return new Cat();
}else if(name.equalsIgnoreCase("pig")){
return new Pig();
}else if(name.equalsIgnoreCase("dog")){
return new Dog();
}else {
return null;
}
}
}
主方法:
public class Main {
public static void main(String[] args) {
AnimalFactory factory=new AnimalFactory();
Animal animal1=factory.getAnimal("dog");
animal1.eat();
Animal animal2=factory.getAnimal("cat");
animal2.eat();
Animal animal3=factory.getAnimal("PIG");
animal3.eat();
}
}
运行结果:
dog is eating
cat is eating
pig is eating