授课语音

工厂模式和抽象工厂模式

1. 介绍

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

工厂模式

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

应用场景:

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

优点:

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

缺点:

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

抽象工厂模式

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

应用场景:

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

优点:

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

缺点:

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

总结比较

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

代码案例

// =================== 工厂模式(Factory Method Pattern) ===================

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

// 具体车辆实现:轿车
class Sedan extends Vehicle {
    drive(): void {
        console.log("驾驶轿车");
    }
}

// 具体车辆实现:SUV
class SUV extends Vehicle {
    drive(): void {
        console.log("驾驶SUV");
    }
}

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

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

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

// =================== 抽象工厂模式(Abstract Factory Pattern) ===================

// Computer 是抽象基类,定义了计算机的 assemble 方法。
abstract class Computer {
    abstract assemble(): void; // 抽象方法
}

// 办公计算机的具体实现:办公台式机
class OfficeDesktop extends Computer {
    assemble(): void {
        console.log("组装办公台式机");
    }
}

// 办公计算机的具体实现:办公笔记本
class OfficeLaptop extends Computer {
    assemble(): void {
        console.log("组装办公笔记本");
    }
}

// 游戏计算机的具体实现:游戏台式机
class GamingDesktop extends Computer {
    assemble(): void {
        console.log("组装游戏台式机");
    }
}

// 游戏计算机的具体实现:游戏笔记本
class GamingLaptop extends Computer {
    assemble(): void {
        console.log("组装游戏笔记本");
    }
}

// 抽象工厂接口,定义创建计算机的方法
interface ComputerFactory {
    createDesktop(): Computer; // 创建台式机
    createLaptop(): Computer; // 创建笔记本
    assembleComputers(): void; // 组装计算机
}

// 办公计算机工厂,生产办公计算机系列
class OfficeComputerFactory implements ComputerFactory {
    private desktop!: OfficeDesktop; // 办公台式机
    private laptop!: OfficeLaptop; // 办公笔记本

    createDesktop(): Computer {
        this.desktop = new OfficeDesktop();
        return this.desktop;
    }

    createLaptop(): Computer {
        this.laptop = new OfficeLaptop();
        return this.laptop;
    }

    assembleComputers(): void {
        if (this.desktop && this.laptop) {
            console.log("组装办公计算机系列:");
            this.desktop.assemble();
            this.laptop.assemble();
        } else {
            console.log("请先创建所有计算机。");
        }
    }
}

// 游戏计算机工厂,生产游戏计算机系列
class GamingComputerFactory implements ComputerFactory {
    private desktop!: GamingDesktop; // 游戏台式机
    private laptop!: GamingLaptop; // 游戏笔记本

    createDesktop(): Computer {
        this.desktop = new GamingDesktop();
        return this.desktop;
    }

    createLaptop(): Computer {
        this.laptop = new GamingLaptop();
        return this.laptop;
    }

    assembleComputers(): void {
        if (this.desktop && this.laptop) {
            console.log("组装游戏计算机系列:");
            this.desktop.assemble();
            this.laptop.assemble();
        } else {
            console.log("请先创建所有计算机。");
        }
    }
}

// 演示工厂模式和抽象工厂模式的使用
function main() {
    // 工厂模式示例
    const sedanFactory: VehicleFactory = new SedanFactory();
    const sedan: Vehicle = sedanFactory.createVehicle();
    sedan.drive();  // 输出: 驾驶轿车

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

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

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

// 运行示例
main();

代码详细介绍

  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___1397757895866987754===f2c9495ab799490a4014a7cf89f3f017===3_1.png___

去1:1私密咨询

系列课程: