写在前面
本文看下工厂方法设计模式。
1:介绍
1.1:什么时候用工厂方法
当我们有若干个种类的对象需要创建,且随着业务的发展,要创建的对象的种类还会不断变化,此时可以考虑使用工厂方法设计模式。
1.2:UML类图
工厂方法设计模式,包含如下元素:
1:抽象工厂类工厂类的抽象,定义一个用于生产对象的方法。
2:具体工厂类继承抽象工厂类,用于生产具体的某项类型的对象(产品)。
3:产品类需要被创建的类。
4:客户端客户端根据需要使用对应的具体工厂类来创建具体的产品(对象)。
如下图:
2:实例
源码 。
2.1:场景
分别需要生产自行车,汽车,飞机,这三类产品。
2.2:程序
- 定义3个具体产品类(包括接口的话4个)
public interface Vehicle {void sayHi();
}public class Plane implements Vehicle {@Overridepublic void sayHi() {System.out.println("hi from " + this.getClass().getSimpleName());}
}public class Car implements Vehicle {@Overridepublic void sayHi() {System.out.println("hi from " + this.getClass().getSimpleName());}
}public class Bicycle implements Vehicle {@Overridepublic void sayHi() {System.out.println("hi from " + this.getClass().getSimpleName());}
}
- 定义抽象工厂类
public abstract class AbstractVehicleFactory<T> {// abstract <T> T makeProduct();public abstract T makeProduct();
}
- 定义自行车工厂类
public class BicycleFactory extends AbstractVehicleFactory<Bicycle> {@Overridepublic Bicycle makeProduct() {return new Bicycle();}
}
- 定义汽车工厂类
public class CarFactory extends AbstractVehicleFactory<Car> {@Overridepublic Car makeProduct() {return new Car();}
}
- 定义飞机工厂类
public class PlaneFactory extends AbstractVehicleFactory<Plane> {@Overridepublic Plane makeProduct() {return new Plane();}
}
2.3:测试
public class FactoryTest {public static void main(String[] args) {// 生产自行车AbstractVehicleFactory<Bicycle> bicycleAbstractVehicleFactory = new BicycleFactory();bicycleAbstractVehicleFactory.makeProduct().sayHi();// 生产汽车AbstractVehicleFactory<Car> carAbstractVehicleFactory = new CarFactory();carAbstractVehicleFactory.makeProduct().sayHi();// 生产飞机AbstractVehicleFactory<Plane> planeAbstractVehicleFactory = new PlaneFactory();planeAbstractVehicleFactory.makeProduct().sayHi();}
}
运行:
hi from Bicycle
hi from Car
hi from PlaneProcess finished with exit code 0
这样当有新的产品时,只需要提供对应的工厂类即可。另外,当我们需要创建的不是一个产品,而是一组需要系统工作的产品时,工厂方法就不行了,需要考虑抽象工厂设计模式。
写在后面
参考文章列表
简单工厂模式、工厂方法模式与抽象工厂模式总结 。