工厂模式
工厂模式:(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
-
核心本质:
- 实例化对象不用 new,用工厂方法代替。
- 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
-
三种模式:
- 简单工厂模式
- 用来生产同一等级结构的任意产品。 (对于增加新的产品,需要覆盖已有代码)
- 工厂方法模式
- 用来生产同一等级结构中的固定产品。(支持增加任意产品)
- 抽象工厂模式
- 围绕一个超级工厂创建其他工厂。超级工厂又称为其他工厂的工厂。
- 简单工厂模式
1. 简单工厂模式
创建一个接口,
public interface Car {
public void name();
}
编写类实现接口,
WuLing.class
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
Tesla .class
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
编写调用类;
public class Consumer {
public static void main(String[] args) {
WuLing wuLing=new WuLing();
Tesla tesla = new Tesla();
wuLing.name();
tesla.name();
}
}
以上是我们经常写的代码,没有用到工厂模式。
改造
添加一个工厂类(相当于中间商
),来实现实现类的初始化。
public class CarFactory {
public static Car getCar(String car) {
if ("五菱".equals(car)) {
return new WuLing();
} else if ("特斯拉".equals(car)) {
return new Tesla();
} else return null;
}
}
这时我们的调用者应该这样写
public class Consumer {
public static void main(String[] args) {
Car wuling = CarFactory.getCar("五菱");
Car tesla = CarFactory.getCar("特斯拉");
wuling.name();
tesla.name();
}
}
这样就避免了new 实现了解耦。
缺点
缺点也很明显当我们想加一个功能时就要修改工厂类。
如何解决这一问题呢?
2.厂方法模式
工厂方法模式的工厂是一个接口,然后每个实现了创建一个各自的工厂实现这个接口工厂。工厂接口
public interface CarFactory {
Car getCar();
}
五菱要有一个自己的工厂。WuLingFactory.class
public class WuLingFactory implements CarFactory {
@Override
public Car getCar() {
return new WuLing();
}
}
特斯拉也要有一个自己的工厂。TeslaFactory.class
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
这时调用者代码
public class Consumer {
public static void main(String[] args) {
Car tesla = new TeslaFactory().getCar();
Car wuLing = new WuLingFactory().getCar();
tesla.name();
wuLing.name();
}
}
这个好处为添加功能时不用修改代码。例如添加一台大众车。就只需要创建它的实现类和工厂就可以,不用修改工厂代码。
大众实现类:
public class DaZong {
public void name() {
System.out.println("大众");
}
}
大众工厂z
public class DaZongFactory implements CarFactory {
@Override
public Car getCar() {
return new DaZong();
}
}
在提供者中添加Car dazong = new DaZongFactory().getCar(); dazong.name();
就可以实现。
简单工厂和方法工厂对比
-
结构复杂度: 简单工厂简单
-
代码复杂度: 简单工厂简单
-
编程复杂度: 简单工厂简单
-
管理上的复杂度: 简单工厂简单
-
根据设计原则: 工厂方法模式
-
根据实际业务:简单工厂模式
来源:CSDN
作者:喝酸奶必舔瓶盖
链接:https://blog.csdn.net/weixin_44689277/article/details/104442461