授课语音

工厂模式和抽象工厂模式

1. 介绍

工厂模式和抽象工厂模式是面向对象设计中常用的两种设计模式,旨在解耦对象的创建过程和使用过程,从而增强系统的灵活性和可维护性。

工厂模式

工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,由子类决定实例化哪个类。工厂模式将对象的实例化推迟到子类,从而提高了系统的灵活性。

应用场景:

  1. 需要大量创建对象的情况:当对象的创建过程复杂,或需要创建的对象可能发生变化时,使用工厂模式可以集中管理对象的创建。
  2. 类不知道需要的对象具体类:例如,某个操作系统的接口,但不确定具体实现的操作系统类型。
  3. 通过子类实例化满足需求:当类希望通过子类来决定具体对象的创建,以避免直接依赖具体实现类。

优点:

  1. 降低耦合度:客户端代码不需要知道创建对象的具体类,只需了解工厂方法。
  2. 增强灵活性:可以通过更改子类的实现方便地扩展系统。
  3. 集中控制对象的创建过程:统一管理对象的创建逻辑,易于维护和扩展。

缺点:

  • 增加系统复杂度:需要创建多个工厂类,可能引入多个接口。

抽象工厂模式

抽象工厂模式也是一种创建型设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而不需要指定具体类。通过定义一个抽象工厂接口,允许子类实现该接口以生成相关对象。

应用场景:

  1. 需要创建一系列相关联的对象:例如创建一套用户界面的控件(按钮、对话框、文本框等)。
  2. 系统需要独立于对象的创建和组合过程:通过一组共同的接口来管理对象,与对象的具体实现解耦。
  3. 支持多种系列的对象创建:如支持不同风格的用户界面(Windows风格、Mac风格)时,抽象工厂模式能够有效管理这些不同系列的对象。

优点:

  1. 可以创建一系列相关的对象:通过统一接口创建一组相关对象,确保一致性和兼容性。
  2. 解耦具体产品实现:客户端代码不依赖于具体产品的实现,仅依赖于抽象接口。
  3. 增加系统扩展性:可以轻松增加新产品系列而无需修改现有代码。

缺点:

  1. 引入更多抽象层次:增加了系统的复杂度,需要处理更多的工厂类和接口。
  2. 产品族变化可能需更改代码:当产品族变化较大时,可能需要修改工厂实现代码。

总结比较

  • 工厂模式侧重于提供创建单一产品对象的接口,主要用于解决具体对象的创建问题。
  • 抽象工厂模式则更为全面,解决创建一系列相关产品对象的问题,适合需要多个对象协调工作的场景。

代码案例

// =================== 工厂模式(Factory Method Pattern) ===================
import java.util.HashMap;
import java.util.Map;

// Vehicle 是抽象基类,定义了车辆的 drive 方法。
abstract class Vehicle {
    public abstract void drive();
}

// 具体车辆实现:轿车
class Sedan extends Vehicle {
    @Override
    public void drive() {
        System.out.println("驾驶轿车");
    }
}

// 具体车辆实现:SUV
class SUV extends Vehicle {
    @Override
    public void drive() {
        System.out.println("驾驶SUV");
    }
}

// 车辆工厂接口,声明工厂方法
interface VehicleFactory {
    Vehicle createVehicle();
}

// 具体工厂A,生产轿车
class SedanFactory implements VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Sedan();
    }
}

// 具体工厂B,生产SUV
class SUVFactory implements VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new SUV();
    }
}

// =================== 抽象工厂模式(Abstract Factory Pattern) ===================
// Computer 是抽象基类,定义了计算机的 assemble 方法。
abstract class Computer {
    public abstract void assemble();
}

// 办公计算机的具体实现:办公台式机
class OfficeDesktop extends Computer {
    @Override
    public void assemble() {
        System.out.println("组装办公台式机");
    }
}

// 办公计算机的具体实现:办公笔记本
class OfficeLaptop extends Computer {
    @Override
    public void assemble() {
        System.out.println("组装办公笔记本");
    }
}

// 游戏计算机的具体实现:游戏台式机
class GamingDesktop extends Computer {
    @Override
    public void assemble() {
        System.out.println("组装游戏台式机");
    }
}

// 游戏计算机的具体实现:游戏笔记本
class GamingLaptop extends Computer {
    @Override
    public void assemble() {
        System.out.println("组装游戏笔记本");
    }
}

// 抽象工厂接口,定义创建计算机的方法
interface ComputerFactory {
    Computer createDesktop();
    Computer createLaptop();
    void assembleComputers();
}

// 办公计算机工厂,生产办公计算机系列
class OfficeComputerFactory implements ComputerFactory {
    private OfficeDesktop desktop;
    private OfficeLaptop laptop;

    @Override
    public Computer createDesktop() {
        desktop = new OfficeDesktop();
        return desktop;
    }

    @Override
    public Computer createLaptop() {
        laptop = new OfficeLaptop();
        return laptop;
    }

    @Override
    public void assembleComputers() {
        if (desktop != null && laptop != null) {
            System.out.println("组装办公计算机系列:");
            desktop.assemble();
            laptop.assemble();
        } else {
            System.out.println("请先创建所有计算机。");
        }
    }
}

// 游戏计算机工厂,生产游戏计算机系列
class GamingComputerFactory implements ComputerFactory {
    private GamingDesktop desktop;
    private GamingLaptop laptop;

    @Override
    public Computer createDesktop() {
        desktop = new GamingDesktop();
        return desktop;
    }

    @Override
    public Computer createLaptop() {
        laptop = new GamingLaptop();
        return laptop;
    }

    @Override
    public void assembleComputers() {
        if (desktop != null && laptop != null) {
            System.out.println("组装游戏计算机系列:");
            desktop.assemble();
            laptop.assemble();
        } else {
            System.out.println("请先创建所有计算机。");
        }
    }
}

// 演示工厂模式和抽象工厂模式的使用
public class Main {
    public static void main(String[] args) {
        // 工厂模式示例
        VehicleFactory sedanFactory = new SedanFactory();
        Vehicle sedan = sedanFactory.createVehicle();
        sedan.drive();  // 输出: 驾驶轿车

        VehicleFactory suvFactory = new SUVFactory();
        Vehicle suv = suvFactory.createVehicle();
        suv.drive();  // 输出: 驾驶SUV

        // 抽象工厂模式示例
        // 办公计算机系列示例
        ComputerFactory officeFactory = new OfficeComputerFactory();
        officeFactory.createDesktop();  // 创建办公台式机
        officeFactory.createLaptop();    // 创建办公笔记本
        officeFactory.assembleComputers();  // 输出: 组装办公计算机系列:组装办公台式机,组装办公笔记本

        // 游戏计算机系列示例
        ComputerFactory gamingFactory = new GamingComputerFactory();
        gamingFactory.createDesktop();  // 创建游戏台式机
        gamingFactory.createLaptop();    // 创建游戏笔记本
        gamingFactory.assembleComputers();  // 输出: 组装游戏计算机系列:组装游戏台式机,组装游戏笔记本
    }
}

代码详细介绍

  1. 工厂模式

    • Vehicle:定义了车辆的抽象接口,包含一个抽象方法 drive,每种具体车辆都需要实现该方法。
    • Sedan 和 SUV:这两个类分别实现了 Vehicle 接口,定义了各自的 drive 方法,输出不同的驾驶信息。
    • VehicleFactory:定义了一个工厂接口,声明了 createVehicle 方法,所有具体工厂都需要实现这个方法。
    • SedanFactory 和 SUVFactory:分别实现了 VehicleFactory 接口,用于创建 SedanSUV 实例。
  2. 抽象工厂模式

    • Computer:定义了计算机的抽象接口,包含一个抽象方法 assemble,具体计算机类需要实现此方法。
    • OfficeDesktop 和 OfficeLaptop:实现了 Computer 接口,分别用于组装办公台式机和笔记本。
    • GamingDesktop 和 GamingLaptop:实现了 Computer 接口,分别用于组装游戏台式机和笔记本。
    • ComputerFactory:抽象工厂接口,定义了创建台式机和笔记本的方法,以及协调工作的 assembleComputers 方法。
    • OfficeComputerFactory 和 GamingComputerFactory:具体工厂,分别用于创建办公和游戏系列的计算机,并实现了 assembleComputers 方法,确保所有计算机可以一起组装。

这个案例清晰地展示了工厂模式和抽象工厂模式的实现及应用,能够帮助我们更好地理解这两种设计模式的使用场景和优势。

图示

Image___1397757896260099962===f2c9495ab799490a4014a7cf89f3f017===3_1.png___

去1:1私密咨询

系列课程: