前言:
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:计算机基础专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏
工厂模式
简介
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的创建与使用代码分离,提供一种统一的接口来创建不同类型的对象。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
接下来我们就以创建车为例
一、简单工厂模式
目录结构:
1.1定义Car接口
public interface Car {
void getInfo();
}
这里我们就简单的写一个方法就行了
1.2写多个车类并实现Car接口
实现一
public class BBCar implements Car {
@Override
public void getInfo() {
System.out.println("BB车");
}
}
实现二
public class HQCar implements Car {
@Override
public void getInfo() {
System.out.println("红旗车");
}
}
1.3创建工厂方法
public class CarFactory {
public static Car getCar(String name){
if("红旗".equals(name)){
return new HQCar();
}else if("BB车".equals(name)){
return new BBCar();
}else {
return null;
}
}
}
这里我们用了很多if-else语句【等一下消除if-else】 来判断工厂最后创建什么车
1.4创建消费者来获取车
public class Consumer {
public static void main(String[] args) {
Car car1 = CarFactory.getCar("红旗");
Car car2 = CarFactory.getCar("BB车");
car1.getInfo();
car2.getInfo();
}
}
最后输出结果也能得到车
1.5我们来消除工厂方法的if-else
public class CarFactory {
private static final Map<String, Car> carHashMap = new HashMap<String, Car>();
static {
carHashMap.put("红旗",new HQCar());
carHashMap.put("BB车",new BBCar());
}
public static Car getCar(String name){
return carHashMap.get(name);
}
}
这里我们用了HashMap
来提前创建了各个车 这样就能直接返回对应的对象了
但是 :
我们又多了新的车了 是不是要去修改工厂方法?添加if-else结构或者在HashMap中添加新的元素!显然不符合开闭原则
那有没有不改动原来的工厂模式呢?答案是有的 接下来看工厂方法模式
二、工厂方法模式
大致思路就是给每个车都实现对应的车工厂
2.1Car接口和工厂接口
public interface Car {
void getInfo();
}
public interface CarFactory {
Car getCar();
}
然后每一个车都要实现car类 ,然后实现工厂接口去创建对应的车
2.2对应的车工厂
public class BBCarFactoryImpl implements CarFactory {
@Override
public Car getCar() {
return new BBCar();
}
}
public class HQCarFactoryImpl implements CarFactory {
@Override
public Car getCar() {
return new HQCar();
}
}
2.3消费者获取车
public class Consumer {
public static void main(String[] args) {
Car car = new BBCarFactoryImpl().getCar();
Car car1 = new HQCarFactoryImpl().getCar();
car.getInfo();
car1.getInfo();
}
}
这样我们添加一个新车都不会修改原来的代码了 ,就只需要实现对应的工厂就行了
对比
对比:
结构复杂度
: 简单工厂模式!(复杂度低)
代码复杂度
: 简单工厂模式!(复杂度低)
管理上的复杂度
: 简单工厂模式!(复杂度低)
编程复杂度
:简单工厂模式!(复杂度低)
根据设计原则: 工厂方法模式!(复杂度低)
根据实际业务: 简单工厂模式!(复杂度低)