工厂模式
简单工厂模式(Simple Factory)
这里要用交通工具做个例子,将交通工具的共同特征跑和停进行抽象,得到如下接口;(当然也有可能有更多的抽象,也可以抽象成抽象类)
public interface Vehicle {
/*
* 车辆跑起来
*
*/
public void run();
/*
* 车辆停下来
*/
public void stop();
}
这里给出了两种交通工具的实现类汽车(car)和自行车(bike);
实现类可以有他们自己的属性和方法,比如动力,轮子个数等;
public class Car implements Vehicle{
@Override
public void run() {
System.out.println("小汽车跑起来...");
}
@Override
public void stop() {
System.out.println("小汽车停下来...");
}
}
public class Bike implements Vehicle{
@Override
public void run() {
System.out.println("自行车跑起来...");
}
@Override
public void stop() {
System.out.println("自行车停下来...");
}
}
工厂类
public class VehicleFactory {
public static Vehicle factory(String className) throws BadRequestException {
if(className.equalsIgnoreCase("car")) {
return new Car();
}else if(className.equalsIgnoreCase("bike")){
return new Bike();
}else {
throw new BadRequestException("无效的请求");
}
}
}
写一个main类模拟客户端
public class Main {
public static void main(String[] args) throws BadRequestException {
Vehicle car = VehicleFactory.factory("car");
car.run();//小汽车跑起来...
Vehicle bike = VehicleFactory.factory("bike");
bike.run();//自行车跑起来...
}
}
使用了这种模式,在客户端程序里,我们便不用关心所想要实现的对象对应的类是怎样的,对象是怎样得到的;工厂类可以根据客户端传入的参数创建出客户端想要的对象,客户端只需用该类的接口或者抽象类去接收这个对象去进行消费。
在改设计模式中有三种关键的角色,当然这三种角色有可能合并在一起但缺一不可;
工厂角色
工厂的角色是这个模式的核心,他是直接被客户端所直接依赖的,同时他包含了在什么情况下创建什么实现类的对象的逻辑。
产品的抽象角色
产品的抽象角色一般是所要创建对象的类所继承的抽象类或者所实现的接口,同时他也是客户端用来接收对象的工具;
产品的实现类角色
产品的实现类角色,他是客户端想要的对象具体的实现类,工厂所创建的对象实际上是对该类的实例;
缺陷:
当产品的实现类增加时,工厂类要修改逻辑,将新增的实现类加入到逻辑中;
另外,由于Java单继承多实现的特性,当产品类实现了多个接口的时候,工厂类就要判断当什么时候去创建这个实现类的对象,当这些判断和要创建哪个实体类的判断交叉相乘,整个逻辑就变得非常复杂;另外由于该模式的实现方法是一个静态方法,无法继承,不利于形成工厂类的纵向结构;这种缺陷在工厂方法模式中得到了解决;
应用:日期的格式化类DateFormat中有经典的应用,可以翻看源码深入了解一下;
工厂方法模式(Factory Method)
相对于简单工厂模式来说,工厂方法模式不仅将产品做了抽象,将工厂本身也做了抽象,将原来的一个实现类生产所有的产品的实现类对象拓展为一个工厂抽象的实现类管理一个产品实现类,解决工厂实现类需要不停的改动和纵向扩展能力差的问题;拿交通工具来说,原本一个交通工具厂生产各种交通工具,汽车、自行车都生产;现在则是汽车厂生产汽车,自行车厂生产自行车;原本的交通工具厂现在则可以看作是一个集团;
集团:
public interface VehicleFactory {
public Vehicle factory();
}
汽车厂:
public class CarFactory implements VehicleFactory{
@Override
public Vehicle factory() {
return new Car();
}
}
自行车厂:
public class BikeFactory implements VehicleFactory {
@Override
public Vehicle factory() {
return new Bike();
}
}
交通工具抽象:
public interface Vehicle {
/*
* 车辆跑起来
*
*/
public void run();
/*
* 车辆停下来
*/
public void stop();
}
汽车:
public class Car implements Vehicle{
@Override
public void run() {
System.out.println("小汽车跑起来...");
}
@Override
public void stop() {
System.out.println("小汽车停下来...");
}
}
自行车:
public class Bike implements Vehicle{
@Override
public void run() {
System.out.println("自行车跑起来...");
}
@Override
public void stop() {
System.out.println("自行车停下来...");
}
}
客户端:
public class Main {
public static void main(String[] args) throws BadRequestException {
VehicleFactory carFactory = new CarFactory();
Vehicle car = carFactory.factory();
car.run();//小汽车跑起来...
VehicleFactory bikeFactory = new BikeFactory();
Vehicle bike = bikeFactory.factory();
bike.run();//自行车跑起来...
}
}
四种角色:
工厂的抽象角色
此模式的核心,定义了工厂的生产动作,是客户端直接依赖的
工厂的实现类
生产对象的实际执行者,也会在被客户端所依赖,只生产与自己对应的实现类的对象,工厂之间互相不影响;
产品的抽象
- 产品的实现类