我们平时出行可以选择的交通工具有汽车、飞机等,假如我们出去旅行,想要选择汽车作为交通工具,我们可以这么写:
1、我们定义一个汽车类(这里使用的是单例模式创建Car,单例模式下可以确保Car类只有一个实例,而且自行实例化,并向整个系统提供这个实例,其它类要生成Car类的实例,只需要调用Car类的getInstance()方法):
public class Car{
private static Car car;
private Car() {
}
public static Car getInstance() {
if (car == null) {
synchronized (Car.class) {
if (car == null) {
car = new Car();
}
}
}
return car;
}
public void run() {
System.out.println("choose car");
}
}
2、然后定义一个Travel类,在里面生成Car实例
public class Travel{
public static void main(String[] args) {
Car car = Car.getInstance();
car.run();
}
}
通过上面的这种方法,我们可以选择Car作为我们出行的交通工具,如果此时我们不想使用Car作为出行工具,想乘坐飞机,那么我们此时就再定义一个Plane类,然后再在Travel类中进行相关的修改,具体操作如下:
1、定义一个Plane类
public class Plance{
private static Plane plane;
private Plane () {
}
public static Plane getInstance() {
if (plane == null) {
synchronized (Plane.class) {
if (plane == null) {
plane = new Plane();
}
}
}
return plane;
}
public void run() {
System.out.println("choose plane");
}
}
2、修改Travel类
public class Travel{
public static void main(String[] args) {
Plane plane = Plane.getInstance();
plane.run();
}
}
这样编写代码,虽然在实现上没什么问题,但是每次切换到别的交通工具上面需要修改的部分太多,有没有方法让我们只需要进行部分修改,就能实现不同交通工具的切换呢?这时候,我们就可以使用到工厂模式
大体实现如下:
- 创建一个 Moveable接口用来定义一些汽车、飞机等都有的特性;
- 创建Car类和Plane类实现Moveable接口;
- 创建一个抽象交通工具工厂类 VehicleFactory,用来创建汽车和飞机等交通工具;
- 创建一个汽车工厂类 CarFactory 和飞机工厂类PlaneFactory,它们都继承自VehicleFactory ,分别用来创建汽车和飞机;
下面看具体的代码实现:
1、创建一个 Moveable接口
public interface Moveable {
abstract void run();
}
2、创建Car类
public class Car implements Moveable{
private static Car car = new Car();
private Car(){}
public static Car getInstance() {
return car;
}
public void run() {
System.out.println("Car run run run ....");
}
}
3、创建Plane类
public class Plane implements Moveable {
private static Plane plane;
private Plane() {
}
public static Plane getInStance() {
return plane;
}
@Override
public void run() {
System.out.println("plane fly lfy lfy....");
}
}
4、创建VehicleFactory类
public abstract class VehicleFactory {
abstract Moveable create();
}
5、创建CarFactory类
public class CarFactory extends VehicleFactory{
public Moveable create() {
return Car.getInstance();
}
}
6、创建PlaneFactory类
public class PlaneFactory extends VehicleFactory {
public Moveable create() {
return Plane.getInStance();
}
}
7、创建Travel类具体实现选择交通工具
public class Travel {
public static void main(String[] args) {
VehicleFactory factory = new PlaneFactory();
Moveable m = factory.create();
m.run();
}
}
上面这种工厂模式的编写方法,当需要修改交通工具时,就只要修改VehicleFactory factory = new PlaneFactory(); 部分
当需要再添加一种交通工具比如Bus时,就只要添加一个Bus类实现Moveable接口,添加一个BusFactory类继承VehicleFactory类
这种工厂模式的编写方法,保证了代码的开放封装原则,但是当要创建的工厂种类越来越多时,就要编写越来越多的工厂类,不便于代码的维护