一、含义
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种接口,用于创建相关或依赖对象的家族,而不需要指定具体类。它是工厂方法模式的扩展,它也通过工厂来创建对象,但不同的是,抽象工厂模式创建的是一系列相关的对象,而工厂方法模式创建的则是一个特定的对象。
抽象工厂模式提供了一个接口,用于创建相关的对象家族,这些家族的对象通常具有共同的特征或目的。例如,在图形用户界面(GUI)的设计中,可能需要创建不同的主题以符合不同的风格需求。使用抽象工厂模式,可以根据需要创建不同的主题工厂,然后使用这些工厂来创建与主题相关的 GUI 组件。在这种情况下,每个工厂将负责创建不同风格的主题组件,例如按钮、下拉菜单、滚动条等。
二、示例
以下是一个完整的抽象工厂模式的代码示例,其中假设我们正在设计一个计算机组装工厂,需要使用不同的工厂来生产不同类型的计算机组件。
首先,我们定义一个 Computer
接口,用于定义计算机的公共方法。接下来,创建具体类 DesktopComputer
和 LaptopComputer
来实现 Computer
接口,表示不同类型的计算机。然后,我们定义一个抽象工厂 ComputerFactory
,其中包含抽象方法 createCpu
、createGpu
和 createRam
,用来创建不同类型的组件。
最后,我们创建具体工厂 DesktopComputerFactory
和 LaptopComputerFactory
,用来分别创建台式计算机和笔记本电脑所需的不同类型组件。
// 计算机接口
public interface Computer {
void display();
}
// 台式计算机
public class DesktopComputer implements Computer {
public void display() {
System.out.println("This is a desktop computer.");
}
}
// 笔记本电脑
public class LaptopComputer implements Computer {
public void display() {
System.out.println("This is a laptop computer.");
}
}
// 抽象工厂
public interface ComputerFactory {
Cpu createCpu();
Gpu createGpu();
Ram createRam();
}
// CPU接口
public interface Cpu {
void display();
}
// CPU实现类
public class DesktopCpu implements Cpu {
public void display() {
System.out.println("This is a desktop CPU.");
}
}
public class LaptopCpu implements Cpu {
public void display() {
System.out.println("This is a laptop CPU.");
}
}
// GPU接口
public interface Gpu {
void display();
}
// GPU实现类
public class DesktopGpu implements Gpu {
public void display() {
System.out.println("This is a desktop GPU.");
}
}
public class LaptopGpu implements Gpu {
public void display() {
System.out.println("This is a laptop GPU.");
}
}
// RAM接口
public interface Ram {
void display();
}
// RAM实现类
public class DesktopRam implements Ram {
public void display() {
System.out.println("This is a desktop RAM.");
}
}
public class LaptopRam implements Ram {
public void display() {
System.out.println("This is a laptop RAM.");
}
}
// 具体工厂:用于生产台式计算机
public class DesktopComputerFactory implements ComputerFactory {
public Cpu createCpu() {
return new DesktopCpu();
}
public Gpu createGpu() {
return new DesktopGpu();
}
public Ram createRam() {
return new DesktopRam();
}
}
// 具体工厂:用于生产笔记本电脑
public class LaptopComputerFactory implements ComputerFactory {
public Cpu createCpu() {
return new LaptopCpu();
}
public Gpu createGpu() {
return new LaptopGpu();
}
public Ram createRam() {
return new LaptopRam();
}
}
在上面的示例代码中,我们使用抽象工厂模式来创建不同类型的计算机组件。我们首先定义了 Computer
接口作为所有计算机的公共接口,然后创建了具体的计算机类 DesktopComputer
和 LaptopComputer
,它们分别实现了 Computer
接口以定义各自特定的方法。
接下来,我们定义了抽象工厂 ComputerFactory
,其中包含了创建不同类型组件的抽象方法 createCpu
、createGpu
和 createRam
。然后,我们创建了具体工厂 DesktopComputerFactory
和 LaptopComputerFactory
,用于分别创建台式计算机和笔记本电脑。
在具体工厂中,我们实现了 createCpu
、createGpu
和 createRam
方法,分别用于创建不同类型计算机所需的不同组件。例如,对于台式计算机工厂 DesktopComputerFactory
,我们创建了 DesktopCpu
、DesktopGpu
和 DesktopRam
。
三、用法
抽象工厂模式的用法在需要创建一系列相关或依赖对象的家族时非常有用。如果我们需要创建多个相关对象,而这些对象可能因为功能需求、风格、平台等因素而不同,此时就可以考虑使用抽象工厂模式。它可以帮助我们封装对象的创建过程,使得我们可以独立地创建这些相关对象的家族。
抽象工厂模式有以下几个优点:
-
封装对象的创建过程:抽象工厂模式帮助我们把对象的创建过程封装起来,使得我们可以专注于定义抽象工厂和具体工厂,并且不需要关注对象的具体细节。
-
提高代码重用性:抽象工厂模式可以提高代码重用性,尤其是在需要创建多个相关对象时非常有用。因为抽象工厂模式帮助我们定义对象的家族,从而可以重复利用这些定义好的对象家族,而不必重复编写代码。
-
保证对象的一致性:抽象工厂模式可以保证创建的对象都属于同一家族,并且这些对象之间是相互依赖的。这可以帮助我们确保不同对象之间的一致性,使得系统更加稳定和可靠。
-
易于扩展和维护:当我们需要添加新的对象家族时,只需要添加新的具体工厂即可。这样,我们就可以逐步地扩展和完善系统,而不必担心代码的复杂度和可维护性。
需要注意的是,抽象工厂模式适合在创建新对象时使用,而不适合于修改已有的对象。因为具体工厂和产品类都是在抽象工厂定义之后才出现的,因此一旦工厂的创建过程定义好了,就不太容易修改。因此,如果需要修改现有对象,可能需要考虑其他的设计模式。