作用:
- 实现了创建者和调用者的分离
- 详细分类:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
OOP七大原则
用到了三个:
- 开闭原则:一个软件的实体应当对扩展开放,对修改关闭
- 依赖倒转原则:要对接口编程,不要针对实现编程
- 迪米特法则:至于你直接的朋友通信,而避免和陌生人通信
工厂模式
核心本质:
- 实例化对象不适用new,用工厂方法代替
- 将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦
三种模式
简单工厂模式:
用来生产统一登记接口中的任意产品(对于增加的新的产品,需要覆盖有代码)注:通过调用者的不同实例化出不同的对象
工厂方法模式:
用来生产同一等级结构中的固定产品(支持增加任意产品)
抽象工厂模式:
未然一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂
抽象工厂模式我在这里没有进行介绍,我后面会出文章进行介绍
需要的bean
//接口
public interface Car {
void name();
}
//接口的实现类
public class Wlhg implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
简单工厂模式
//静态工厂模式 简单工厂模式
//增加一个产品,如果不修改代码的情况下,做不到!
//开闭原则
public class CarFactory {
//不好扩展 方法一
public static Car getCar(String car){
if("五菱".equals(car)){
return new Wlhg();
}else if ("特斯拉".equals(car)){
return new Tesla();
}else {
return null;
}
}
//方法二
public static Car getWuling(){
return new Wlhg();
}
public static Car getTesla(){
return new Tesla();
}
}
测试类
public class Consumer {
public static void main(String[] args){
//2.使用简单工厂创建
Car car = CarFactory.getCar("五菱");
Car car2 = CarFactory.getCar("特斯拉");
assert car != null;
car.name();
assert car2 != null;
car2.name();
}
}
结果为: 五菱宏光,特斯拉
问题:如果在加一个大众的车型呢,在原有的代码上是不是要进行修改呢
疑问:在使用简单工厂模式,是不是就不符合开闭原则了呢
工厂模式
//加了各个的工厂类
public interface CarFactory {
Car getCar();
}
//特斯拉的工厂类
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
//五菱的工厂类
public class WulingFactory implements CarFactory{
@Override
public Car getCar() {
return new Wlhg();
}
}
public class Consumer {
public static void main(String[] args){
Car car = new TeslaFactory().getCar();
Car car1 = new WulingFactory().getCar();
car.name();
car1.name();
}
}
结果为:特斯拉
五菱宏光
简单工厂模式和工厂模式分析:
- 结构复杂度: simple(简单工厂模式)
- 代码复杂度: simple
- 编程复杂度: simple
- 管理复杂度: simple
- 根据设计原则: 工厂方法模式!
- 根据实际业务: 简单工厂模式!
小结
简单工厂模式
虽然某种程度上不符合设计原则,但是实际使用最多!
工厂方法模式
不修改已有类的前提下,通过增加新的工厂实现扩展
抽象工厂模式
不可以增加产品,可以增加产品族!
应用场景
- JDK中Calendar的getInstance方法
- JDBC中Connection对象的获取
- Spring中IOC容器创建管理对象
- 反射中Class对象的newInstance