创建型-工厂方法
简单工厂
- 将被创建的对象称为“产品”,将生产“产品”对象称为“工厂”;
- 如果创建的产品不多,且不需要生产新的产品,那么只需要一个工厂就可以,这种模式叫做“简单工厂”,它不属于23中设计模式之一;
- 简单工厂这种模式不符合对拓展开放,对修改关闭的开闭原则,因为这种设计模式,新增产品的时候需要修改工厂类代码;
例
简单工厂:
/** 简单工厂,工厂类*/
public class SimpleFactory {private static SimpleFactory INSTANCE = new SimpleFactory();public static SimpleFactory getInstance(){return INSTANCE;}public Car createCar() {return new Car();}public Plane createPlane() {return new Plane();}public Train creatTrain(){return new Train();}
}
简单工厂使用:
public class main {public static void main(String[] args) {SimpleFactory simpleFactory = SimpleFactory.getInstance();Car car = simpleFactory.createCar();Plane plane = simpleFactory.createPlane();Train train = simpleFactory.creatTrain();}
}
这种模式如果产生一个other交通工具,还需要在工厂类中新增creatOther()方法。
工厂方法
角色
- 抽象工厂:提供创建产品的接口,调用者通过它访问具体的工厂的工厂方法;
- 具体工厂:实现抽象工厂中的抽象方法,完成具体的创建;
- 抽象产品:定义产品的规范,描述产品的主要特性;
- 具体产品:实现抽象产品角色定义的接口,它与具体工厂一一对应;
图解
实现案例
产品抽象类:
public interface Vehicle {void go();
}
产品具体实现类:
public class Car implements Vehicle{@Overridepublic void go() {System.out.println("汽车在跑!");}
}public class Plane implements Vehicle{@Overridepublic void go() {System.out.println("火车在跑!");}
}public class Train implements Vehicle{@Overridepublic void go() {System.out.println("飞机在飞!");}
}
抽象工厂类:
public interface VehicleFactory {Vehicle create();
}
具体工厂类:
public class CarFactory implements VehicleFactory{private static CarFactory INSTANCE = new CarFactory();@Overridepublic Vehicle create() {return new Car();}public static CarFactory getInstance(){return INSTANCE;}
}public class PlaneFactory implements VehicleFactory{private static PlaneFactory INSTANCE = new PlaneFactory();@Overridepublic Vehicle create() {return new Plane();}public static PlaneFactory getInstance(){return INSTANCE;}
}
public class TrainFactory implements VehicleFactory{private static TrainFactory INSTANCE = new TrainFactory();@Overridepublic Vehicle create() {return new Train();}public static TrainFactory getInstance(){return INSTANCE;}
}
使用:
public class main {public static void main(String[] args) {CarFactory carFactory = CarFactory.getInstance();Vehicle vehicle = carFactory.create();vehicle.go();}
}
总结
- 简单工厂不符合开闭原则。
- 工厂方法,每次增加一个产品时,都需要增加一个具体类和对应的工厂,使系统中类的数量成倍增加,增加了系统的复杂度和具体类的依赖;