静态工厂方法替代构造器

在类的内部讲构造器私有化,创建一个static的构造方法,就是静态工厂方法替代构造器。

最简单的一个静态工厂方法替代构造器示例:(好处就是创造时更清晰)

csharp 复制代码
public class Book {
    private String title;
    private String author;  

    // 私有构造函数,防止直接实例化
    private Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    // 静态工厂方法
    public static Book createBookByTitleAndAuthor(String title, String author) {
        return new Book(title, author);
    }
}

单例模式,多例模式,池化模式下,使用静态工厂方法,有一定优势:(静态工厂方法的最重要的优点)

csharp 复制代码
public class Car{
	private static final Map<String,Car> carPool=new HashMap<>();
	private String model;
	private Car(model){
		this.model=model;
	}
	public static Car createCar(String model){
		Car car=carPool.get(model);
		if(car==null){
			car=new Car(model);
			carPool.put(model,car);
		}
		return car;
	}
}

使用一个接口来实现静态工厂方法:

csharp 复制代码
public interface Car {
    void drive();
    
    static Car createCar(String type) {
        if (type.equalsIgnoreCase("Sedan")) {
            return new Sedan();
        } else if (type.equalsIgnoreCase("SUV")) {
            return new SUV();
        }
        throw new IllegalArgumentException("Unknown car type");
    }

    class Sedan implements Car {
        @Override
        public void drive() {
            System.out.println("Driving a Sedan");
        }
    }

    class SUV implements Car {
        @Override
        public void drive() {
            System.out.println("Driving an SUV");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Car sedan = Car.createCar("Sedan");
        sedan.drive();  // 输出: Driving a Sedan

        Car suv = Car.createCar("SUV");
        suv.drive();  // 输出: Driving an SUV
    }
}
相关推荐
知守观6 分钟前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
深盾科技_Virbox8 分钟前
换机或重装后软件许可怎么恢复:先核对哪四项
java·服务器·数据库
Zhuo1Joy8 分钟前
中间件挂了怎么办:兜底的边界与取舍
java
用户072367066609 分钟前
基于 JavaAgent 的无侵入 Mock:让联调和链路测试不再等下游
java·后端
小蒜学长10 分钟前
基于SpingBoot+Vue的定向越野赛事管理系统的设计与开发(代码+数据库+LW)
java·前端·spring boot·后端·前后端分离·定向越野赛事
海岳云舟10 分钟前
spring自带线程池使用不当导致的死锁问题
java·后端
yuzhiboyouye15 分钟前
Optional和Stream经典丰富的用法demo,以及相关的详细介绍
java
SuperHeroWu717 分钟前
ArkGenie 的技术原理:从一段 SSE 到一个可交互 Surface
开发语言·php·交互
小蒜学长27 分钟前
基于过程性评价的ai助学平台(代码+数据库+LW)
java·spring boot·后端·微信小程序·过程性评价
洁洁!32 分钟前
手搓 C++ 线程池详细讲解以及如何面试应答
java·c++·面试