工厂模式(Factory Pattern)
Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
先说下简单的工厂方法模式:
汽车接口
/** * 汽车接口 */ public interface Car{ String getType(); }
豪华轿车:limousine
/** * 豪华汽车 */ public class limousine implements Car{ private String type = "豪华汽车"; @Override public String getType() { return type; } }
货车:truck
/** * 货车 */ public class truckimplements Car{ private String type = "货车"; @Override public String getType() { return type; } }
车工厂:CarFactory
public class CarFacotry { public static Car creatCar(String type){ switch (type){ case "货车": return new Truck(); case "豪华汽车": return new Limousine(); default: return null; } } }
测试类
public class Clineter { public static void main(String[] args) { Car car = CarFacotry.creatCar("货车"); System.out.println(car.getType()); } }
打印结果:
这就是简单工厂方法,只有一个工厂类来面向多个目标实现。当目标实现增多时,我们不得不去修改工厂类的方法,使其兼容新的实现类型,这明显违背了开闭原则,所以出现了工厂方法模式。
二、工厂模式
汽车接口
public interface Car { String getType(); }
豪华轿车:limousine
public class Limousine implements Car { private String type = "豪华汽车"; @Override public String getType() { return type; } }
货车:
public class Truck implements Car { private String type = "货车"; @Override public String getType() { return type; } }
车的工厂接口:
public interface CarFactory {
//这里就不用定义是什么类型的车了,想用什么类型的车直接调用对应类型车的工厂就好 Car creatCar(); }
豪华汽车工厂:
public class LimousineFactory implements CarFactory{ @Override public Car creatCar() { return new Limousine(); } }
货车工厂:
public class TruckFactory implements CarFactory{ @Override public Car creatCar() { return new Truck(); } }
测试类:
public class Clineter { public static void main(String[] args) { // CarFactory carFacotry = new TruckFactory(); Car car = carFacotry.creatCar(); System.out.println(car.getType()); } }
从上面的实例中可以很容易看出来,工厂方法模式的重点就在这个工厂接口了。
目标可以无限扩展,工厂类也要随之扩展,一对一存在,满足了开闭原则,但如果目标实现较多,工厂实现类也会增多,不简洁。
MyBatis中使用的比较多,事务模块和数据源模块都使用了工厂方法模式。
使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
ps:1995年,四位小伙( Erich Gamma,Richard Helm,Ralph Johnson ,John Vlissides 被业内称为GoF)合著一本书
里面包含了23中设计模式,根据设计的目的分为三大类型:
1.创建型模式
这一类设计模式的目的是用于创建对象。
2.结构型模式
这一类设计模式的目的是优化不同类、对象、接口之间的结构关系。
3.行为型模式
这一类设计模式的目的是更好地实现类与类之间的交互以及算法的执行。
每一个类型所包含的具体设计模式,总结在下图当中:
有些地方可能说24中模式,除了上面的模式之外还加了空对象模式,可归结到行为型模式中。
随着发展现状也出现其他的模式,如并发moshi、生产者消费者模式、发布订阅模式