1.什么是工厂模式?
工厂模式的主要解决的问题是,将原来分布在各个地方的对象创建过程单独抽离出来,交给工厂类负责创建。其他地方想要使用对象直接找工厂(即调用工厂的方法)获取对象。
2.作用:
实现类创建者和调用者的分离
1).工厂模式是为了解耦:把对象的创建和使用的过程分开
2).工厂模式可以降低代码重复
3)因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误
3.核心本质:
实例化对象不使用new,用工厂方法代替
将选择实现类,创建对象统一管理和控制。从而将调用者和我们的实现类解耦
4.详细分类:
1.简单工厂模式/静态工厂模式
用来生产同一等级结构中的任意产品
2.工厂方法模式
用来生产同一等级结构中的固定产品
3.抽象工厂模式
围绕一个超级工厂创建其他工厂。该超级工行又称为其他工厂的工厂
5.简单工厂模式/静态工厂模式:
弊端:如果你不修改代码(工厂类),无法增加新的产品
代码实例(实现一个买汽车的过程)
1)构建一个汽车接口
package gongchang.simple;
public interface Car {
void name();
}
2)分别两种汽车型号类继承这个接口
特斯拉
public class Tesla implements Car {
@Override
public void name() {
System.out.println("我是特斯拉");
}
}
五菱
public class Wuling implements Car{
@Override
public void name() {
System.out.println("我是五菱宏光");
}
}
3)构建工厂类
public class CarFactor {
public static Car getCar(String car){
if (car.equals("五菱")){
return new Wuling();
}else if(car.equals("特斯拉")){
return new Tesla();
}else {
return null;
}
}
}
4)创建消费者类,使用工厂创建这个对象,从而避免了手动new对象
通俗来讲就是我去买汽车去工厂买了已经造好的汽车,而不是自己手动去new一辆汽车
public class Consumer {
public static void main(String[] args) {
//使用工厂创建
Car car = CarFactor.getCar("特斯拉");
car.name();
}
}
5)优化:修改工厂类的结构
略微增加了可扩展性
public class CarFactor {
public static Car getWuling(){
return new Wuling();
}
public static Car getTesla(){
return new Tesla();
}
}
6.工厂方法模式
创建新产品时进行横向扩展,创建新的工厂类,不需要修改原有代码
1)创建汽车接口,车型类,消费者类这三步与简单工厂模式相同
2)创建汽车工厂接口
3)当添加每种型号汽车时,分别调用上面的接口创建自己的工厂类
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
public class WulingFactory implements CarFactory {
@Override
public Car getCar() {
return new Wuling();
}
}
7.两种模式对比总结:
简单工厂模式:
结构复杂度较优
代码复杂度较优
编程复杂度较优
管理复杂度较优
根据设计原则应选择:工厂方法模式
根据实际业务应选择:简单工厂模式