Java
工厂模式
工厂模式:
- 实现了调用者和创建者的分离。
- 详细分类:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
面向对象设计的基本原则:
- OCP(开闭原则,Open-Closed-Principle):一个软件的实体应当对扩展开放,对修改关闭。
- DIP(依赖倒转原则):要针对接口编程,不要针对实现编程。
- LOD(迪米特法则):只与你直接的朋友通信,而避免和陌生人通信。
核心本质:
- 实例化对象,用工厂方法代替new操作。
- 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
工厂模式
- 简单工厂模式
- 用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)
- 工厂方法模式
- 用来生产同一等级结构中的固定产品
- 抽象工厂模式
- 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
简单工厂模式:
接口
public interface Car {
void run();
}
奥迪类
public class Audi implements Car {
@Override
public void run() {
System.out.println("奥迪在跑");
}
}
奔驰类
public class BenCi implements Car {
@Override
public void run() {
System.out.println("奔驰在跑");
}
}
简单工厂类
public class CarFactory {
private static Car car;
public static Car createCar(String name) {
switch (name) {
case "奥迪":
car = new Audi();
break;
case "奔驰":
car = new BenCi();
break;
default:
break;
}
return car;
}
}
调用类
private void test() {
Car audi = CarFactory.createCar("奥迪");
Car benci = CarFactory.createCar("奔驰");
audi.run();
benci.run();
}
工厂方法模式
工厂方法模式要点:
- 为了避免简单工厂模式的缺点,不完全满足OCP。
- 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
1.
public interface Car {
void run();
}
public class Benci implements Car {
@Override
public void run() {
System.out.println("奔驰在跑!");
}
}
public class Baoma implements Car {
@Override
public void run() {
System.out.println("宝马在跑!");
}
}
2.
public interface CarFactory {
Car createCar();
}
public class BenciFactory implements CarFactory {
@Override
public Car createCar() {
return new Benci();
}
}
public class BaomaFactory implements CarFactory {
@Override
public Car createCar() {
return new Baoma();
}
}
3.
private void test() {
Car benci = new BenciFactory().createCar();
Car baoma = new BaomaFactory().createCar();
benci.run();
baoma.run();
}
output:
奔驰在跑!
宝马在跑!
实际上,我们一般都用简单工厂模式