设计一个工厂类:
工厂类提供一些静态方法,间接的去创建具体的对象
优点:
不需要在创建具体类的对象,而是把创建的工作交给了工厂类来创建!
弊端:
如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护(违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中)
步骤:
1)新建一个接口,写出要实现的方法。
动物吃的功能public abstract class Animal { //抽象功能 public abstract void eat() ; }
2)新建一个实现类来实现上面的接口,实现接口里面的方法。
创造一只猫public class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼..."); } }创造一只狗
public class Dog extends Animal{ @Override public void eat() { System.out.println("狗吃骨头..."); } }
3)新建一个工厂类,私有无参构造方法(不让外界创建该类对象),所以这个类里面的方法需要是静态的。在这个类里面来新建对象。
public class AnimalFactory { //无参构造私有:外界不能创建该类对象 private AnimalFactory() { } //想办法用多态的形式解决:代码扩展性 public static Animal createAnimal(String type) { if("cat".equals(type)) { //将传入的参数进行对比 return new Cat() ; }else if("dog".equals(type)) { return new Dog() ; } return null; } }
4)新建一个演示类,使用工厂类来创建对象(使用多态,提高代码的扩展性),然后调用实现类的方法。
public static void main(String[] args) { //改进:使用抽象类多态的形式改进工厂类 Animal a = AnimalFactory.createAnimal("cat") ; a.eat(); a = AnimalFactory.createAnimal("dog") ; //提高了扩展性 a.eat(); a = AnimalFactory.createAnimal("pig") ; //对象进行非空判断 if(a!=null) {// 如果输入的在工程类中没有定义则会报错java.lang.NullPointerException,所以需要进行非空判断。 a.eat(); }else { System.out.println("抱歉,当前工厂类不提供该动物类的创建"); } }