工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。
实例一:
package org.jzkangta.factorydemo01; //定义接口 interface Car{ public void run(); public void stop(); } //具体实现类 class Benz implements Car{ public void run(){ System.out.println("Benz开始启动了。。。。。"); } public void stop(){ System.out.println("Benz停车了。。。。。"); } } //具体实现类 class Ford implements Car{ public void run(){ System.out.println("Ford开始启动了。。。"); } public void stop(){ System.out.println("Ford停车了。。。。"); } } //工厂 class Factory{ public static Car getCarInstance(){ return new Ford(); } } public class FactoryDemo01 { public static void main(String[] args) { Car c=Factory.getCarInstance(); c.run(); c.stop(); } }
实例二:
package fac; //定义接口 interface Car{ public void run(); public void stop(); } //具体实现类 class Benz implements Car{ public void run(){ System.out.println("Benz开始启动了。。。。。"); } public void stop(){ System.out.println("Benz停车了。。。。。"); } } class Ford implements Car{ public void run(){ System.out.println("Ford开始启动了。。。"); } public void stop(){ System.out.println("Ford停车了。。。。"); } } //工厂 class Factory{ public static Car getCarInstance(String type){ Car c=null; if("Benz".equals(type)){ c=new Benz(); } if("Ford".equals(type)){ c=new Ford(); } return c; } } public class FactoryDemo02 { public static void main(String[] args) { Car c=Factory.getCarInstance("Benz"); if(c!=null){ c.run(); c.stop(); }else{ System.out.println("造不了这种汽车。。。"); } } }
实例三:
interface Car{ public void run(); public void stop(); } class Benz implements Car{ public void run(){ System.out.println("Benz开始启动了。。。。。"); } public void stop(){ System.out.println("Benz停车了。。。。。"); } } class Ford implements Car{ public void run(){ System.out.println("Ford开始启动了。。。"); } public void stop(){ System.out.println("Ford停车了。。。。"); } } class Toyota implements Car{ public void run(){ System.out.println("Toyota开始启动了。。。"); } public void stop(){ System.out.println("Toyota停车了。。。。"); } } class Factory{ public static Car getCarInstance(String type){ Car c=null; try { c=(Car)Class.forName("org.jzkangta.factorydemo03."+type).newInstance();//利用反射得到汽车类型 } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return c; } } public class FactoryDemo03 { public static void main(String[] args) { Car c=Factory.getCarInstance("Toyota"); if(c!=null){ c.run(); c.stop(); }else{ System.out.println("造不了这种汽车。。。"); } } }
对比三个实例:
实例一,虽然实现了简单工厂,但每次只能得到一种汽车,如果我们想换一种,就得修改工厂,太不方便,而实例二则改变了这种情况,便得我们可以按照我们的需要更换汽车,但我们所更换的汽车必须是实现类中有的,如果我们想要增加一种汽车的时候,我们还是得更改工厂,通过改进,实例三利用反射机制,得到汽车类型,这样当我们需要增加一种新的汽车时,就无需要再修改工厂,而只需要增加要实现的类即可。也就是说要增加什么样的汽车直接增加这个汽车的类即可,而无需改变工厂。从而达到了工厂分离的效果。
(本文参考《java与模式》及〈浪曦〉视频教程,并引用了相关实例)