You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请讲解Java中的Factory Pattern等四种设计模式

Java 四种核心设计模式详解

1. 工厂模式(Factory Pattern)

工厂模式属于创建型设计模式,核心是封装对象的创建逻辑,让调用方无需依赖具体实现类,只通过工厂接口/类获取实例,降低代码耦合度。

两种常见实现:

简单工厂(Simple Factory)

不属于GoF正式定义的设计模式,但实际开发中广泛使用,适合创建逻辑简单的场景:

// 产品接口
interface Shape {
    void draw();
}

// 具体产品类
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制正方形");
    }
}

// 简单工厂类
class ShapeFactory {
    public static Shape getShape(String type) {
        return switch (type.toLowerCase()) {
            case "circle" -> new Circle();
            case "square" -> new Square();
            default -> throw new IllegalArgumentException("不支持的形状类型");
        };
    }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.getShape("circle");
        circle.draw();
    }
}

工厂方法(Factory Method)

定义一个创建对象的接口,让子类决定实例化哪个类,将对象创建逻辑延迟到子类实现:

// 抽象工厂接口
interface ShapeFactory {
    Shape createShape();
}

// 具体工厂类
class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

class SquareFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Square();
    }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        ShapeFactory factory = new CircleFactory();
        Shape shape = factory.createShape();
        shape.draw();
    }
}

2. 抽象工厂模式(Abstract Factory Pattern)

抽象工厂是工厂模式的扩展,用于创建一系列相关或相互依赖的对象族,客户端无需关心具体产品的实现细节,只需要指定对应的工厂即可获取整套配套产品。

示例:跨平台UI组件创建

// 抽象产品:按钮
interface Button {
    void render();
}

// 抽象产品:复选框
interface Checkbox {
    void check();
}

// Windows风格具体产品
class WindowsButton implements Button {
    @Override
    public void render() {
        System.out.println("渲染Windows风格按钮");
    }
}

class WindowsCheckbox implements Checkbox {
    @Override
    public void check() {
        System.out.println("选中Windows风格复选框");
    }
}

// Mac风格具体产品
class MacButton implements Button {
    @Override
    public void render() {
        System.out.println("渲染Mac风格按钮");
    }
}

class MacCheckbox implements Checkbox {
    @Override
    public void check() {
        System.out.println("选中Mac风格复选框");
    }
}

// 抽象工厂接口
interface UIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// Windows风格工厂
class WindowsUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}

// Mac风格工厂
class MacUIFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new MacCheckbox();
    }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        UIFactory factory = new WindowsUIFactory();
        Button button = factory.createButton();
        Checkbox checkbox = factory.createCheckbox();
        
        button.render();
        checkbox.check();
    }
}

3. 单例模式(Singleton Pattern)

确保一个类全局只有一个实例,并提供统一的全局访问点,常用于日志组件、数据库连接池、配置中心等场景。

几种可靠实现:

饿汉式(Eager Initialization)

类加载阶段就创建实例,天然线程安全,但可能提前占用内存:

public class EagerSingleton {
    private static final EagerSingleton INSTANCE = new EagerSingleton();

    private EagerSingleton() {}

    public static EagerSingleton getInstance() {
        return INSTANCE;
    }
}

双重检查锁(Double-Checked Locking)

延迟加载+线程安全,需用volatile禁止指令重排:

public class DCLSingleton {
    private static volatile DCLSingleton INSTANCE;

    private DCLSingleton() {}

    public static DCLSingleton getInstance() {
        if (INSTANCE == null) {
            synchronized (DCLSingleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new DCLSingleton();
                }
            }
        }
        return INSTANCE;
    }
}

静态内部类(Static Inner Class)

利用类加载机制实现延迟加载和线程安全,性能最优:

public class InnerClassSingleton {
    private InnerClassSingleton() {}

    private static class SingletonHolder {
        private static final InnerClassSingleton INSTANCE = new InnerClassSingleton();
    }

    public static InnerClassSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

枚举实现(Enum Singleton)

最简洁、线程安全且能防止序列化/反射破坏的实现:

public enum EnumSingleton {
    INSTANCE;

    public void doSomething() {
        System.out.println("单例实例执行操作");
    }
}

// 调用方式:EnumSingleton.INSTANCE.doSomething();

4. 建造者模式(Builder Pattern)

用于构建多参数、复杂对象,将对象的构建过程与最终表示分离,允许逐步配置不同参数,避免构造函数参数过多导致的代码可读性问题。

示例:用户对象构建

public class User {
    // 必填参数
    private final String username;
    private final String email;
    // 可选参数
    private final Integer age;
    private final String phone;
    private final String address;

    // 私有构造,仅由Builder调用
    private User(Builder builder) {
        this.username = builder.username;
        this.email = builder.email;
        this.age = builder.age;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    // 静态内部Builder类
    public static class Builder {
        // 必填参数
        private final String username;
        private final String email;
        // 可选参数,默认值为null
        private Integer age;
        private String phone;
        private String address;

        // Builder构造方法,传入必填参数
        public Builder(String username, String email) {
            this.username = username;
            this.email = email;
        }

        // 链式设置可选参数
        public Builder age(Integer age) {
            this.age = age;
            return this;
        }

        public Builder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public Builder address(String address) {
            this.address = address;
            return this;
        }

        // 构建并返回User实例
        public User build() {
            return new User(this);
        }
    }

    // Getter方法
    public String getUsername() { return username; }
    public String getEmail() { return email; }
    public Integer getAge() { return age; }
    public String getPhone() { return phone; }
    public String getAddress() { return address; }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        User user = new User.Builder("john_doe", "john@example.com")
                .age(28)
                .phone("1234567890")
                .address("123 Main St")
                .build();
    }
}

内容的提问来源于stack exchange,提问作者Navod Kamilka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:46:57