先写程序,在来解释简单工厂和工厂方法模式。
1、定义一个汽车接口
package com.beckham.factory;
/**
* @author 作者
* Email:gaowm0207@gmail.com
* Jan 26, 2010 2:35:15 PM
* Version:1.0
*/
public interface Car {
public void start() ;
}
接口里面定义一个方法:start()
2、实现该接口的汽车
奔驰
package com.beckham.factory;
/**
* @author 作者
* Email:gaowm0207@gmail.com
* Jan 26, 2010 3:07:25 PM
* Version:1.0
*/
public class Benz implements Car {
public void start() {
System.out.println("奔驰车启动了。。。。");
}
}
奥迪
package com.beckham.factory;
/**
* @author 作者
* Email:gaowm0207@gmail.com
* Jan 26, 2010 3:07:46 PM
* Version:1.0
*/
public class Audi implements Car {
public void start() {
System.out.println("奥迪车启动了。。。。。。");
}
}
到此,已经有2种汽车实现了汽车接口
package com.beckham.factory;
public class Test {
/**
* Owner
* Jan 26, 2010 2:37:11 PM
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Car c = new Benz() ;
//Car c = new Audi() ;
c.start() ;
}
}
我们可以通过自己new不同的对象,从而创建不同对象的实例调用共同的start方法。
这是我们就会想,是不是可以把产生汽车的过程放在一个工厂里面,而我们调用的时候只需要告诉工厂我们需要哪种汽车,工厂就返回给我们该汽车呢?那么我们就创建该工厂。
package com.beckham.factory;
/**
* @author 作者
* Email:gaowm0207@gmail.com
* Jan 26, 2010 2:49:46 PM
* Version:1.0
*/
public class CarFactory {
/*
* carName 就是需要工厂产生的对象
* 通过反射机制来获取该对象的实例
*/
public static Car getInstance(String carName) throws Exception {
return (Car) Class.forName(carName).newInstance();
}
}
工厂接受传递过来的汽车的名称,返回该汽车的实例
package com.beckham.factory;
public class Test {
/**
* Owner
* Jan 26, 2010 2:37:11 PM
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//需要那种对象的实例,直接把该对象的名称告诉工厂就行
Car car = CarFactory.getInstance("com.beckham.factory.Audi") ;
car.start() ;
}
}
这时候,我们就不需要自己new汽车了,只需要告诉工厂我们需要Audi,那么工厂就返回我们