第3课设计模式_工厂_抽象工厂模式
热度🔥:45 免费课程
授课语音
工厂模式和抽象工厂模式
1. 介绍
工厂模式和抽象工厂模式是面向对象设计中常用的两种设计模式,旨在解耦对象的创建过程和使用过程,从而增强系统的灵活性和可维护性。
工厂模式
工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,由子类决定实例化哪个类。工厂模式将对象的实例化推迟到子类,从而提高了系统的灵活性。
应用场景:
- 需要大量创建对象的情况:当对象的创建过程复杂,或需要创建的对象可能发生变化时,使用工厂模式可以集中管理对象的创建。
- 类不知道需要的对象具体类:例如,某个操作系统的接口,但不确定具体实现的操作系统类型。
- 通过子类实例化满足需求:当类希望通过子类来决定具体对象的创建,以避免直接依赖具体实现类。
优点:
- 降低耦合度:客户端代码不需要知道创建对象的具体类,只需了解工厂方法。
- 增强灵活性:可以通过更改子类的实现方便地扩展系统。
- 集中控制对象的创建过程:统一管理对象的创建逻辑,易于维护和扩展。
缺点:
- 增加系统复杂度:需要创建多个工厂类,可能引入多个接口。
抽象工厂模式
抽象工厂模式也是一种创建型设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而不需要指定具体类。通过定义一个抽象工厂接口,允许子类实现该接口以生成相关对象。
应用场景:
- 需要创建一系列相关联的对象:例如创建一套用户界面的控件(按钮、对话框、文本框等)。
- 系统需要独立于对象的创建和组合过程:通过一组共同的接口来管理对象,与对象的具体实现解耦。
- 支持多种系列的对象创建:如支持不同风格的用户界面(Windows风格、Mac风格)时,抽象工厂模式能够有效管理这些不同系列的对象。
优点:
- 可以创建一系列相关的对象:通过统一接口创建一组相关对象,确保一致性和兼容性。
- 解耦具体产品实现:客户端代码不依赖于具体产品的实现,仅依赖于抽象接口。
- 增加系统扩展性:可以轻松增加新产品系列而无需修改现有代码。
缺点:
- 引入更多抽象层次:增加了系统的复杂度,需要处理更多的工厂类和接口。
- 产品族变化可能需更改代码:当产品族变化较大时,可能需要修改工厂实现代码。
总结比较
- 工厂模式侧重于提供创建单一产品对象的接口,主要用于解决具体对象的创建问题。
- 抽象工厂模式则更为全面,解决创建一系列相关产品对象的问题,适合需要多个对象协调工作的场景。
代码案例
// =================== 工厂模式(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();
代码详细介绍
工厂模式
- Vehicle:定义了车辆的抽象接口,包含一个抽象方法
drive
,每种具体车辆都需要实现该方法。 - Sedan 和 SUV:这两个类分别实现了
Vehicle
接口,定义了各自的drive
方法,输出不同的驾驶信息。 - VehicleFactory:定义了一个工厂接口,声明了
createVehicle
方法,所有具体工厂都需要实现这个方法。 - SedanFactory 和 SUVFactory:分别实现了
VehicleFactory
接口,用于创建Sedan
和SUV
实例。
- Vehicle:定义了车辆的抽象接口,包含一个抽象方法
抽象工厂模式
- Computer:定义了计算机的抽象接口,包含一个抽象方法
assemble
,具体计算机类需要实现此方法。 - OfficeDesktop 和 OfficeLaptop:实现了
Computer
接口,分别用于组装办公台式机和笔记本。 - GamingDesktop 和 GamingLaptop:实现了
Computer
接口,分别用于组装游戏台式机和笔记本。 - ComputerFactory:抽象工厂接口,定义了创建台式机和笔记本的方法,以及协调工作的
assembleComputers
方法。 - OfficeComputerFactory 和 GamingComputerFactory:具体工厂,分别用于创建办公和游戏系列的计算机,并实现了
assembleComputers
方法,确保所有计算机可以一起组装。
- Computer:定义了计算机的抽象接口,包含一个抽象方法
这个案例展示了工厂模式和抽象工厂模式的实现及应用,帮助更好地理解这两种设计模式的使用场景和优势。