设计模式之简单工厂

    xiaoxiao2021-04-16  26

    如果要定义一个动物类,然后动物类中需要声明动物的say方法,那有几种动物该肿么办呢?正常情况下我们会这么做(起码我一开始也是这么做了很久):

    public class Animal { public String name; public void say(){ if(this.name.equals("dog")){ System.out.print("汪汪汪!"); }else if(this.name.equals("cat")){ System.out.print("喵喵喵!"); }else if(this.name.equals("fish")){ System.out.print("...."); } } }

    可是这样写,我们今天要加个snake,明天又加一个bird,岂不是需要不停的在这个类中添加代码?这样的话,这个类会越来越臃肿,对吧?

    然后呢,前辈们就想了一个办法:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法

    代码如下: 动物类:

    abstract class Animal { public void say(){ } }

    猫类:

    public class Cat extends Animal{ public void say(){ System.out.print("miao!"); } }

    狗类:

    public class Dog extends Animal{ public void say(){ System.out.print("wang!"); } }

    实现类:

    public class testMain2 { public static void main(String[] args) { testMain2 t = new testMain2(); Animal animal; animal = t.getAnimal("Cat"); animal.say(); } public Animal getAnimal(String type){ Animal animal=null; if(type.equals("Cat")){ animal = new Cat(); }else if(type.equals("Dog")){ animal = new Dog(); } return animal; } }

    这样搞感觉还是不太好,因为我在实现的时候还要判断才能拿到,用反射优化实现类:

    public class testMain2 { public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException { testMain2 t = new testMain2(); Animal animal = t.getAnimal(Dog.class); animal.say(); } public Animal getAnimal(Class c) throws ClassNotFoundException, IllegalAccessException, InstantiationException { Animal animal= (Animal) Class.forName(c.getName()).newInstance(); return animal; } }

    Ok,Done!

    转载请注明原文地址: https://ju.6miu.com/read-672645.html

    最新回复(0)