Java23种设计模式之工厂方法模式

前言

工厂方法模式: 是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

核心本质:
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() 及其他类似的方法。

识别方法: 工厂方法可通过构建方法来识别, 它会创建具体类的对象, 但以抽象类型或接口的形式返回这些对象。

总结

不一定要符合设计原则,要根据实际情况加以分析取舍。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小严

你的鼓励是我创作的源泉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值