Java工厂模式详解:方法工厂模式与抽象工厂模式

Java工厂模式详解:方法工厂模式与抽象工厂模式

一、引言

在Java开发中,设计模式是解决常见软件设计问题的一种有效方式。工厂模式作为创建型设计模式的一种,提供了灵活的对象创建机制,有助于降低代码的耦合度,提高系统的可维护性和可扩展性。本文将详细介绍Java中的方法工厂模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)。

二、方法工厂模式

2.1 定义

方法工厂模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。

2.2 结构

方法工厂模式主要包含以下几个角色:

  • 抽象工厂角色(Creator):声明了工厂方法,用于返回一个产品对象。
  • 具体工厂角色(Concrete Creator):实现了抽象工厂角色中的工厂方法,用于返回一个具体的产品对象。
  • 抽象产品角色(Product):定义了产品的接口,是工厂方法所创建对象的超类型,也就是产品对象的共同接口。
  • 具体产品角色(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂角色创建,客户端通过抽象产品角色使用具体产品。

2.3 优点

  • 可扩展性:当需要增加新的产品时,只需要增加相应的具体产品类和具体工厂类,无需修改现有代码。
  • 解耦:将产品的创建与使用分离,客户端只需要知道产品接口,而无需知道具体产品的类名。

2.4 缺点

  • 增加类的数量:每增加一个产品,都需要增加一个具体产品类和一个具体工厂类,增加了系统的复杂性。

2.5 代码示例

java 复制代码
// 抽象产品角色
public interface Product {
    void doSomething();
}

// 具体产品A
public class ProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("A do Something");
    }
}

// 具体产品B
public class ProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("B do Something");
    }
}

// 抽象工厂角色
public abstract class Factory {
    abstract Product create();
}

// 具体工厂A
public class FactoryA extends Factory {
    @Override
    Product create() {
        return new ProductA();
    }
}

// 具体工厂B
public class FactoryB extends Factory {
    @Override
    Product create() {
        return new ProductB();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Factory factory = new FactoryA();
        Product product = factory.create();
        product.doSomething();

        factory = new FactoryB();
        product = factory.create();
        product.doSomething();
    }
}

三、抽象工厂模式

3.1 定义

抽象工厂模式(Abstract Factory Pattern)提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

3.2 结构

抽象工厂模式主要包含以下几个角色:

  • 抽象工厂角色(Abstract Factory):声明了一组用于创建产品的抽象方法。
  • 具体工厂角色(Concrete Factory):实现了抽象工厂角色中的抽象方法,用于创建具体的产品对象。
  • 抽象产品角色(Abstract Product):定义了产品的接口,是工厂方法所创建对象的超类型。
  • 具体产品角色(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂角色创建。

3.3 优点

  • 封装性:客户端只需要知道产品的抽象类型,无需关心具体产品的实现细节。
  • 可扩展性:当需要增加新的产品族时,只需要增加相应的具体产品类和具体工厂类,无需修改现有代码。
  • 灵活性:可以在不修改客户端代码的情况下更换产品族。

3.4 缺点

  • 增加系统的复杂性:由于涉及到多个抽象层,增加了系统的理解和维护难度。

3.5 代码示例

java 复制代码
// 抽象产品A
public interface Engine {
    void run();
    void start();
}

// 具体产品A1
public class LuxuryEngine implements Engine {
    @Override
    public void run() {
        System.out.println("转的快");
    }

    @Override
    public void start() {
        System.out.println("启动快!可以自动启停!");
    }
}

// 抽象产品B
public interface Seat {
    void massage();
}

// 具体产品B1
public class LuxurySeat implements Seat {
    @Override
    public void massage() {
        System.out.println("可以自动按摩");
    }
}

// 抽象工厂角色
public interface CarFactory {
    Engine createEngine();
    Seat createSeat();
}

// 具体工厂A
public class LuxuryCarFactory implements CarFactory {
    @Override
    public Engine createEngine() {
        return new LuxuryEngine();
    }

    @Override
    public Seat createSeat() {
        return new LuxurySeat();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        CarFactory factory = new LuxuryCarFactory();
        Engine engine = factory.createEngine();
        engine.run();
        engine.start();

        Seat seat = factory.createSeat();
        seat.massage();
    }
}

四、总结

方法工厂模式和抽象工厂模式都是用于创建对象的设计模式,但它们的应用场景和侧重点不同。方法工厂模式侧重于单个对象的创建,通过子类决定实例化哪个类;而抽象工厂模式则侧重于创建一系列相关或相互依赖的对象,通过接口来定义一组产品的创建方法。在实际开发中,应根据具体需求选择合适的设计模式。

相关推荐
公贵买其鹿13 分钟前
List深拷贝后,数据还是被串改
java
思忖小下20 分钟前
梳理你的思路(从OOP到架构设计)_设计模式Template Method模式
设计模式·模板方法模式·eit
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭5 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫5 小时前
泛型(2)
java
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石5 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc