1、基本概念
官方术语:先创建一个工厂类,对实现了同一个接口的不同实现类进行实例创建。
大白话:说白了就是你想要哪个类跟工厂说就行,工厂把你想要的类创建好,然后你拿过来直接就能用。
种类:工厂模式又可以分为四种:普通工厂模式、工厂方法模式、静态工厂模式、抽象工厂模式。
前三种工厂模式是违背开闭原则的,因为你每次新增一个业务,增加业务类的同时,工厂类里面也需要进行修改。
抽象工厂类没有违背开闭原则,因为每个业务都有自己对应的工厂,每次新增一个业务,也会去新增一个对应的工厂,大家互不影响。
开闭原则:扩展开放,修改关闭。说白了就是你要新增一个业务的时候不要影响到之前的,不要我每次新增一个业务都要去原来的里面去修改。
优点:在需要大量创建对象的前提下,用工厂模式扩展性好,可维护性强。
缺点:代码稍微复杂,可读性稍微有点儿差。
2、具体实现
「交通工具接口」
public interface Vehicle{
void go();
}
「汽车类」实现交通工具接口
public class Car implements Vehicle{
@Override
public void go() {
System.out.println("坐汽车...");
}
}
「火车类」实现交通工具接口
public class Train implements Vehicle{
@Override
public void go() {
System.out.println("坐火车...");
}
}
「飞机类」实现交通工具接口
public class Airplane implements Vehicle{
@Override
public void go() {
System.out.println("坐飞机...");
}
}
「工厂类」普通工厂模式、工厂方法模式、静态工厂模式 的工厂类
public class GoFactory{
// 普通工厂模式
public Vehicle produce(String type) {
if("car".equals(type)) {
return new Car();
}
if("train".equals(type)) {
return new Train();
}
if("airplane".equals(type)) {
return new Airplane();
}
return null;
}
// 工厂方法模式
public Vehicle produceCar() {
return new Car();
}
public Vehicle produceTrain() {
return new Train();
}
public Vehicle produceAirplane() {
return new Airplane();
}
// 静态工厂模式
public static Vehicle produceCar() {
return new Car();
}
public static Vehicle produceTrain() {
return new Train();
}
public static Vehicle produceAirplane() {
return new Airplane();
}
}
「工厂接口」抽象工厂模式的接口
public interface Provider{
public Vehicle produce();
}
「工厂接口」抽象工厂模式的工厂类
public class CarGoFactory implements Provider{
@Override
public Vehicle produce() {
return new Car();
}
}
public class TrainGoFactory implements Provider{
@Override
public Vehicle produce() {
return new Train();
}
}
public class AirplaneGoFactory implements Provider{
@Override
public Vehicle produce() {
return new Airplane();
}
}
「工厂测试类」模拟调用
public class GoFactoryTest{
public static void main(String[] args) {
// 1.普通工厂模式调用
// 声明工厂类型引用工厂对象
GoFactory goFactory = new GoFactory();
// 调用工厂的生产方法
Vehicle vehicle = goFactory.produce("train");
// 使用对象模拟行为
vehicle.go();
// 2.工厂方法模式调用
GoFactory goFactory = new GoFactory();
Vehicle vehicle = goFactory.produceTrain();
vehicle.go();
// 3.静态工厂模式调用
Vehicle vehicle = GoFactory.produceTrain();
vehicle.go();
// 4.抽象工厂模式调用
Vehicle vehicle = new TrainGoFactory();
vehicle.go();
}
}
早期的单体架构的负责服务APP的网关调用就是通过工厂模式来搭建,一般是通过普通工厂模式创建的,因为需要传调用的服务类型,去获取想要调用的接口。