前提
交通工具接口 Vehicle,且有一个抽象方法 run();
package demo.simplefactory; /** * 交通工具接口 * @author Martin * create by 2013-6-3 * update by 2013-6-3 */ public interface Vehicle { /** * 运行 * @param destination 目的地 */ public void run(String destination); }
Bus 类实现 Vehicle 接口,并实现 run() ;
package demo.simplefactory; /** * Bus * @author Martin * create by 2013-6-3 * update by 2013-6-3 */ public class Bus implements Vehicle { @Override public void run(String destination) { System.out.println("\t我是一辆 bus,到达 " + destination + ", 需要三个小时。"); } }
Car 类实现 Vechicle 接口,并实现 run();
package demo.simplefactory; public class Car implements Vehicle {
@Override
public void run(String destination) {
System.out.println("\t我是一辆 car,到达 " + destination + ",需要一个小时,很快吧!");
}
}
好吧,到现在为止,我想分别实例化 Bus 类和 Car 类,应该这么做:
Vehicle bus = new Bus();
Vehicle car = new Car();
问题
但是这样有一个不好的地方就是,用户知道了你的实现(Bus和Car)。有时候用户不应该也不想知道你是怎么实现的,他就想他要一个速度快的交通工具,你给他一个就可以了;他要一个普通速度的交通工具,你给他一个普通的就行了。
方案
这时,我们就需要一个工厂类,交通工具工厂类 VehicleFactory。当用户说,你给我一个速度快的工具,你就给他一个。在 VehicleFactory 里就有一个静态方法 createVehicle(String type),参数 type 用来让用户告诉你,他要什么样速度的交通工具。 VehicleFactory 如下:
package demo.simplefactory; public class VehicleFactory { /** * 快速交通工具 */ public static String VEHICLE_FAST = "fase"; /** * 普通交通工具 */ public static String VEHICLE_NORMAL = "normal"; /** * 构造方法私有话 */ private VehicleFactory() {} /** * 创建交通工具 * @param type 交通工具类型 * @return */ public static Vehicle createVehicle(String type) { Vehicle result = null; if(VEHICLE_FAST.equals(type)) { result = new Car(); } else if(VEHICLE_NORMAL.equals(type)) { result = new Bus(); } return result; } }
下面,客户端这可以这样调用:
package demo.simplefactory; public class Client { public static void main(String[] args) { go("西藏"); } public static void go(String destination) { System.out.println("去 " + destination + ",我需要快速交通工具:"); Vehicle vehicle = VehicleFactory.createVehicle(VehicleFactory.VEHICLE_FAST); vehicle.run(destination); System.out.println(); System.out.println("去 " + destination + ",我需要变通交通工具:"); Vehicle vehicle2 = VehicleFactory.createVehicle(VehicleFactory.VEHICLE_NORMAL); vehicle2.run(destination); } }
输出
去 西藏,我需要快速交通工具:
我是一辆 car,到达 西藏,需要一个小时,很快吧!
去 西藏,我需要变通交通工具:
我是一辆 bus,到达 西藏, 需要三个小时。
好处
隐藏实现
Vehicle vehicle = VehicleFactory.createVehicle(VehicleFactory.VEHICLE_FAST); 你只知道是一个速度快的交通工具,但你不知道具体是什么。
类图