标签:style blog color 使用 java ar div 问题 sp
嗯,刚开始学Java,把学到的东西一点点的记录一下,方便巩固。
工厂模式的百度定义是这样的:
工厂模式定义:实例化对象,用工厂方法代替new操作。
简单易懂,就是说,在new一个新对象的时候,使用一个方法,这个方法是属于一个工厂类的。
下面贴代码:
//接口 interface Animal { public void bark(); } //子类-小狗 class Dog implements Animal { void bark() { System.out.println("wow!"); } } //子类-小猫 class Cat implements Animal { void bark() { System.out.println("meow!"); } }
普通方法实例化产生新的小猫小狗对象:
//普通方法实例化 class Test { public static void main(String[] args) { Dog dog = new Dog(); Cat cat = new Cat(); dog.bark(); cat.bark(); } }
工厂模式:
//动物工厂 class AnimalFactory { public Animal creator(String animalName) { if (animalName.equals("Dog")) { Animal dog = new Dog(); return dog; } else if (animalName.equals("Cat")) { Animal cat = new Cat(); return cat; } } } //使用工厂模式来创建新的对象 class Test { public static void main(String[] args) { AnimalFactory factory = new AnimalFactory(); Animal dog = factory.creator("Dog"); Animal cat = factory.creator("Cat"); dog.bark(); cat.bark(); } }
在这里先解释一下上面为什么是
Animal dog = factory.creator("Dog");
而不是
Dog dog = factory.creator("Dog");
首先动物工厂是一个工厂,creator方法的返回类型是Animal, Animal类是一个接口,我们知道接口是不能被实例化的,这里就涉及到了向上转型的问题了。
额外补充一点向上转型的知识,例如父类Animal有个bark()方法,假设子类Dog继承了父类并且定义了一个新的方法eat(),那么Animal dog = new Dog()的时候,dog.eat()编译的时候就会报错,原因是一个引用可以调用哪些成员函数和变量取决于这个引用的类型,而Animal里面只有bark()方法,所以编译出错了。
再假设子类Cat继承了父类并且重写了bark()方法,这个时候Animal cat = new Cat(),调用cat.bark(),输出的结果是什么呢?
是Cat类被重写的bark()方法,原因是一个引用调用的是哪一个方法取决于这个引用指向的对象,因为cat指向的是Cat()对象,虽然它的类型是Animal,但是调用方法却是Cat里面的bark()方法。
好的,回到工厂模式,仔细看上面的代码,那么就会有人问,为什么要用工厂模式,在上面的代码看来,好像工厂模式更加复杂,而且没有直接实例化那么清晰明了。
小的程序比较难看出工厂模式的优点。比如说有新的需求,在一个类的基础上生成了一个子类,那么现在要把以前使用父类的地方都给改为子类,如果小程序可能有几十个地方要改,如果大一点可能就几百几千个地方要改了。如果使用工厂模式,那么只要将工厂产生的对象修改了就可以了。
但是工厂模式也不是绝对好的,在网上搜索的时候,有前辈说工厂模式主要是针对于多态,就是一个类会派生出许许多多的之类,这个情况下就要使用工厂模式。有些其他的情况反而是一个累赘,还是视情况而定。
上面是我个人的理解和看法,如果有错误请指正!共同学习,一起进步!
标签:style blog color 使用 java ar div 问题 sp
原文地址:http://www.cnblogs.com/keeno/p/3963155.html