引子:
假设有一个交通工具公司,生产自行车,汽车,飞机等,现要销售该公司的产品,要怎么设计呢?
在交通工具商店中加一个if else判断如果是自行车就实例化(new)一个自行车,如果是汽车就实例化(new)一个汽车吗,当然不是,这样的话如果将来又加了多种交通工具那要更改每一个商店的代码,这样的话更改太多,我们应该把这部分可能变更的代码封装到另一个对象中,这个对象只管生产何种交通工具,要获得交通工具就用它。
简单工厂:
类图:
设计:
复制代码
/**
* 抽像的交通工具类,里面有生产交通工具的过程方法(控制生产过程)
* @author Homg
*
*/
public abstract class Vehicle {
public abstract void produceComponent();
public abstract void assemble();
public abstract void test();
}
复制代码
具体产品类,其他具体产品类(bike,plane)省略,完整代码在文章的最下方有
下载地址:
复制代码
/**
* 具体的产品,继承自抽象类,以用被工厂生产出来
* @author Homg
*
*/
public class Car extends Vehicle{
@Override
public void produceComponent() {
// TODO Auto-generated method stub
System.out.println("生产汽车零件");
}
@Override
public void assemble() {
// TODO Auto-generated method stub
System.out.println("组装成汽车");
}
@Override
public void test() {
// TODO Auto-generated method stub
System.out.println("测试汽车性能");
}
}
复制代码
复制代码
/**
* 简单交通工具工厂,这是唯一new具体交通工具的地方
*
* @author Homg
*
*/
public class SimpleVehicleFactory {
// 该方法也可以是静态的(静态工厂)
public Vehicle createVehicle(String type) {
Vehicle vehicle = null;
if ("bike".equals(type)) {
vehicle = new Bike();
vehicle = new Car();
} else if ("plane".equals(type)) {
vehicle = new Plane();
}
//可以设置默认产品以免为null
return vehicle;
}
}
复制代码
复制代码
/**
* 销售交通工具,工厂的使用者。
*
* @author Homg
*
*/
public class VehicleStore {
// 工厂的引用,从构造函数中获得
private SimpleVehicleFactory factory;
public VehicleStore(SimpleVehicleFactory factory) {
this.factory = factory;
}
// 通过传入订单的类型来获得相应的产品,不需要实例化(new)任何一个具体类,全部通过createVehicle()来获得。
public Vehicle orderVehicle(String type) {
Vehicle vehicle;
vehicle = factory.createVehicle(type);
vehicle.produceComponent();
vehicle.assemble();
vehicle.test();
return vehicle;
}
}
复制代码
测试:
复制代码
public static void main(String[] args) {
SimpleVehicleFactory factory = new SimpleVehicleFactory();
VehicleStore vehicleStore = new VehicleStore(factory);
// 依次生产三种交通工具
Vehicle vehicle1 = vehicleStore.orderVehicle("car");
System.out.println("-------------------------------------");
Vehicle vehicle2 = vehicleStore.orderVehicle("bike");
System.out.println("-------------------------------------");
Vehicle vehicle3 = vehicleStore.orderVehicle("plane");
}
复制代码
运行结果:
生产汽车零件
组装成汽车
测试汽车性能
-------------------------------------
生产自行车零件
组装成自行车
测试自行车性能
-------------------------------------
生产飞机零件
组装成飞机
测试飞机性能
☆`·.· `·..· `·..· ☆`·.· `·..· ☆ ☆`·.· `·..· `·..· ☆`·.· `·..· ☆ ☆`·.· `·..· `·..· ☆`·.· `·..· ☆
以后如果有新的交通工具要生产,只需要更改工厂类一处即可,商店类中不需要实例化任何一个具体的交通工具类,实例化(new)操作都放到工厂类的方法中。工厂类中的创建方法也可以改成静态的(静态工厂),这样可以不用实例化对象来使用工