工厂设计模式,不仅可以使用父类做方法的形参,还可以使用父类做方法的返回值类型,真实返回的对象可以是该类的任意一个子类对象。
简单工厂模式的实现,它是解决大量对象创建问题的一个解决方案。将创建和使用分开,工厂负责创建,使用者直接调用即可。简单工厂模式的基本要求是
1.定义一个static方法,通过类名直接调用
2.返回值类型是父类类型,返回的可以是其任意子类类型
3.传入一个字符串类型的参数,工厂根据参数创建对应的子类产品
public class Animal {
//父类:动物:
public void shout(){
System.out.println("我是小动物,我可以叫。。。");
}
}
public class Cat extends Animal{
//喊叫方法:
public void shout(){
System.out.println("我是小猫,可以喵喵叫");
}
public void scratch(){
System.out.println("我是小猫,我可以挠人");
}
}
public class Dog extends Animal{
//喊叫:
public void shout(){
System.out.println("我是小狗,我可以汪汪叫");
}
public void guard(){
System.out.println("我是小狗,我可以看家护院,保护我的小主人。。。");
}
}
public class Pig extends Animal{
public void shout(){
System.out.println("我是小猪,我嗯嗯嗯的叫");
}
public void eat(){
System.out.println("我是小猪,我爱吃东西。。");
}
}
public class Girl {
//跟猫玩耍:
/*public void play(Cat cat){
cat.shout();
}*/
//跟狗玩耍:
/*public void play(Dog dog){
dog.shout();
}*/
//跟小动物玩耍:
public void play(Animal an){
an.shout();
}
}
如果对多态还没有清楚的认识,可以看一下这篇文章
链接: 速通面向对象三大特性.
建立工厂类
public class PetStore {
//宠物店---》工厂类
//方法: 提供动物
public static Animal getAnimal(String petName){
//多态的应用场合
Animal an = null;
if("猫".equals(petName)){
//使用petName.equals("猫") == 》容易出现空指针异常
an = new Cat();
}else if("狗".equals(petName)){
an = new Dog();
}else if("猪".equals(petName)){
an = new Pig();
}
return an;
}
}
测试类
public class Demo {
public static void main(String[] args) {
Girl g = new Girl();
//Cat c = new Cat();
//Dog d = new Dog();
//Pig p = new Pig();
Animal an = PetStore.getAnimal("狗");
g.play(an);
}
}
结果: 我是小狗,我可以汪汪叫
可以从上面直观的感受到多态应用到工厂类的效果:
一个工厂类可以直接使用static调用动物类;
而通过多态多态的特性,可以返回该父类或者其子类,作为返回类型;
我们仅需要输入字符串参数,工厂类则会自动将创建出对应的子类产品~