工厂模式
作用
实现了创建者和调用者的分离
详细分类
1.简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要球盖已有代码)
2.工厂方法模式:用来生产同一等级结构中固定产品(支持增加任意产品)
3.抽象工厂模式:围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
OOP七大原则:
开闭原则:一个软件的实体应当对扩展开放,对修改关闭
依赖倒装原则:要针对接口编程,不要针对实现编程
迪米特法则:只与你直接的朋友通信,而避免和陌生人通信
核心本质
实例化对象不使用new,用工厂方法代替
将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
小结
简单工厂模式:(静态工厂模式)
虽然某种程度上不符合设计原则,但实际使用最多!
工厂方法模式:
不修改已有类的前提下,通过增加新的工厂类进行实现
抽象工厂模式:
不可以增加产品,可以增加产品族
应用场景
JDK中Calendar的getInstance方法
JDBC中的Connection对象的获取
Spring中IOC容器创建管理bean对象
反射中Class对象的newInstance方法
简单工厂模式代码示例
实现不同品牌面的工厂生产
Noodles.java
public interface Noodles {
void name();
}
HsNoodles.java
public class HsNoodles implements Noodles {
@Override
public void name() {
System.out.println("我是红烧牛肉面");
}
}
ScNoodles.java
public class ScNoodles implements Noodles {
@Override
public void name() {
System.out.println("我是酸菜面");
}
}
NoodlesFactory.java
public class NoodlesFactory {
// 方式一
public static Noodles getNoodles(String noodles){
if (noodles.equals("红烧牛肉面")){
return new HsNoodles();
}else if (noodles.equals("酸菜面")){
return new ScNoodles();
}else {
return null;
}
}
// 方式二
public static Noodles getHsNoodles(){
return new HsNoodles();
}
public static Noodles getScNoodles(){
return new ScNoodles();
}
}
Consumer.java
public class Consumer {
public static void main(String[] args) {
NoodlesFactory.getNoodles("红烧牛肉面").name();
}
}
执行流程:创建产品接口,让不同的产品进行实现,最终由产品工厂进行判断创建
弊端:
简单工厂模式又称静态工厂模式
不满足开闭原则,即当如果有新产品进来的时候还要修改代码
工厂方法模式代码示例
工厂方法模式是在简单工厂模式的基础上进行改进,沿用上述例子中的Noodles.java,HsNoodles.java,ScNoodles.java,增加了以下的接口以及实现方法
NoodlesFactory.java
public interface NoodlesFactory {
Noodles getNoodles();
}
HsNoodlesFactory.java
public class HsNoodlesFactory implements NoodlesFactory{
@Override
public Noodles getNoodles() {
return new HsNoodles();
}
}
ScNoodlesFactory.java
public class ScNoodlesFactory implements NoodlesFactory{
@Override
public Noodles getNoodles() {
return new ScNoodles();
}
}
Consumer.java
public class Consumer {
public static void main(String[] args) {
Noodles noodles1 = new HsNoodlesFactory().getNoodles();
Noodles noodles2 = new ScNoodlesFactory().getNoodles();
noodles1.name();
noodles2.name();
}
}
创建流程:创建产品接口,将简单工厂模式中的产品工厂转变为接口,由各个产品实现产品接口,各个产品工厂实现工厂接口,在工厂中new对象
简单工厂和工厂方法模式对比:
结构复杂度:Simple
代码复杂度:Simple
变成复杂度:Simple
管理上的复杂度:Simple 根据设计原则:工厂方法模式
根据实际业务:简单工厂模式