前言
工厂方法模式: 是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
核心本质:
1、实例化对象不使用new,用工厂方法代替,
2、将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦
一、简单工厂模式
业务实例:使用生产汽车来讲解该模式
1、Car.class 汽车制造标准规范接口(AbstractProduct)
public interface Car {
void make();
}
2、BaoMa.class
public class BaoMa implements Car{
@Override
public void make() {
System.out.println("制造宝马汽车=======================");
}
}
3、BenChi.class
public class BenChi implements Car{
@Override
public void make() {
System.out.println("制造奔驰汽车=======================");
}
}
4、Demo.class
在未使用工厂模式的情况下,我们制造汽车,需要自己去new要制造的车,不符合我们的工厂模式设计思想:
public class Demo {
public static void main(String[] args) {
Car chiCar = new BeiChiCar();
Car baoMa = new BaoMaCar();
chiCar.make();
baoMa.make();
}
}
5、CarFactory.class 创建工程类,让他帮我们实现new车操作
/**
* 简单工厂模式
* @author DT辰白 Created by 2023/3/20 21:33
*/
public class CarFactory {
public static Car makeCar(String car){
if(car.equals("奔驰")) {
return new BenChiCar();
} else if(car.equals("宝马")) {
return new BaoMaCar();
} else {
return null;
}
}
}
调用简单工厂类、直接制造不同类型的车。
public class Demo{
public static void main(String[] args) {
Car chiCar = CarFactory.makeCar("奔驰");
Car baoMa = CarFactory.makeCar("宝马");
chiCar.make();
baoMa.make();
}
}
总结:此时当我们想要制造大众车的时候,我们也需要创建一个实现类,去实现Car,此时我们的工厂类(CarFactory )需要修改makeCar方法代码了,违反了开闭原则,我们应该扩展,不应该修改。
二、工厂方法模式
工厂方法模式,每种类型的汽车都有自己的工厂,横向扩展,实现了开闭原则。
public interface CarFactory {
Car makeCar();
}
public class BaoMaFactory implements CarFactory{
@Override
public Car makeCar() {
return new BaoMaCar();
}
}
public class BenChiFactory implements CarFactory{
@Override
public Car makeCar() {
return new BenChiCar();
}
}
public class Demo {
public static void main(String[] args) {
CarFactory benChiFactory = new BenChiFactory();
CarFactory baoMaFactory = new BaoMaFactory();
benChiFactory.makeCar().make();
baoMaFactory.makeCar().make();
}
}
优点:
1、下次加入大众车,只需要新建一个 DazhongFactory(大众的工厂) 就行,不会影响到别的工厂。
2、你可以避免创建者和具体产品之间的紧密耦合。
3、单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
4、开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。
缺点:
代码量加大,管理复杂,结构复杂,实际业务一般使用简单工厂模式。
三、工厂方法模式适合应用场景
核心 Java 程序库中有该模式的应用:
java.util.Calendar#getInstance()
java.util.ResourceBundle#getBundle()
java.text.NumberFormat#getInstance()
java.nio.charset.Charset#forName()
java.net.URLStreamHandlerFactory#createURLStreamHandler(String) (根据协议返回不同的单例对象)
java.util.EnumSet#of()
javax.xml.bind.JAXBContext#createMarshaller() 及其他类似的方法。
识别方法: 工厂方法可通过构建方法来识别, 它会创建具体类的对象, 但以抽象类型或接口的形式返回这些对象。
总结
不一定要符合设计原则,要根据实际情况加以分析取舍。