概念
工厂模式是一种常见的设计模式,它用于创建对象而无需直接暴露对象的创建逻辑。它提供了一种将对象的实例化过程封装起来的方式,使得客户端代码可以通过工厂接口或类来创建对象,而无需知道具体的实现细节。
工厂模式通常包括以下几个角色:
-
抽象产品(Abstract Product)
:定义了产品的通用接口,具体产品将实现这些接口。 -
具体产品(Concrete Product)
:实现了抽象产品接口的具体类,是工厂模式所创建的对象。 -
抽象工厂(Abstract Factory)
:定义了创建产品的接口,可以是一个接口或抽象类。 -
具体工厂(Concrete Factory)
:实现了抽象工厂接口的具体类,负责创建具体产品的实例。
核心思想
工厂模式的核心思想是将对象的创建与使用相分离,通过引入工厂类来创建对象,从而降低了客户端代码与具体类之间的依赖关系。客户端只需要与工厂接口或类进行交互,而无需关心具体的产品实现细节。
举例
假设我们正在开发一个电脑生产线,需要根据客户的需求生产不同类型的电脑,包括台式机和笔记本电脑。首先,我们定义一个抽象产品接口 Computer,其中包括一个方法 assemble():
public interface Computer {
void assemble();
}
然后,我们实现两个具体产品类 DesktopComputer(台式机)和 LaptopComputer(笔记本电脑),它们分别实现了抽象产品接口中的 assemble() 方法:
public class DesktopComputer implements Computer {
@Override
public void assemble() {
System.out.println("Assembling desktop computer...");
// 具体的组装逻辑
}
}
public class LaptopComputer implements Computer {
@Override
public void assemble() {
System.out.println("Assembling laptop computer...");
// 具体的组装逻辑
}
}
接下来,我们定义一个抽象工厂接口 ComputerFactory,其中包括一个方法 createComputer(),用于创建电脑对象:
public interface ComputerFactory {
Computer createComputer();
}
最后,我们实现两个具体工厂类 DesktopComputerFactory(台式机工厂)和 LaptopComputerFactory(笔记本电脑工厂),它们分别实现了抽象工厂接口中的 createComputer() 方法:
public class DesktopComputerFactory implements ComputerFactory {
@Override
public Computer createComputer() {
return new DesktopComputer();
}
}
public class LaptopComputerFactory implements ComputerFactory {
@Override
public Computer createComputer() {
return new LaptopComputer();
}
}
现在,我们可以通过具体工厂类来创建相应类型的电脑对象,而无需直接调用具体产品类。例如:
ComputerFactory desktopFactory = new DesktopComputerFactory();
Computer desktop = desktopFactory.createComputer();
desktop.assemble(); // 输出:Assembling desktop computer...
ComputerFactory laptopFactory = new LaptopComputerFactory();
Computer laptop = laptopFactory.createComputer();
laptop.assemble(); // 输出:Assembling laptop computer...
通过以上示例,我们可以看到,客户端只需要与抽象工厂接口 ComputerFactory 进行交互,并通过工厂类来创建具体的电脑对象。这样,客户端与具体产品类解耦,提高了代码的灵活性和可维护性。
工厂模式好处
-
解耦客户端和具体产品类:客户端只需要与抽象工厂接口或类交互,无需直接调用具体产品类,从而降低了客户端代码与具体实现之间的耦合度。
-
提高代码的可维护性和可扩展性:当需要新增一种产品时,只需新增相应的具体产品类和对应的具体工厂类,而不需要修改现有的客户端代码,从而提高了代码的灵活性和可维护性。
-
符合面向对象设计原则中的开闭原则:即对扩展开放,对修改关闭。工厂模式将对象的创建与使用相分离,使得客户端代码不受具体实现的影响,从而支持代码的扩展而不修改。
-
促进代码的重用:通过将对象的创建逻辑封装在工厂类中,可以在多个地方重复使用相同的工厂类,从而实现代码的重用。
-
隐藏具体实现细节:工厂类将具体创建逻辑封装在内部,客户端无法访问实际的构造方法,从而隐藏了具体实现的细节。
综上所述,工厂模式是一种常用的设计模式,它通过将对象的创建与使用相分离,实现了代码的解耦、可维护性和可扩展性,符合面向对象设计原则中的开闭原则,并促进了代码的重用和具体实现细节的隐藏。
应用场景
-
需要创建复杂对象:当需要创建的对象比较复杂,包含多个部分或需要进行多步骤操作时,可以采用工厂模式将创建逻辑封装在工厂类中,使得客户端代码更加简洁清晰。
-
需要创建多个相似对象:当需要创建多个相似的对象时,可以使用工厂模式,将对象的创建逻辑封装在工厂类中,避免客户端重复的创建相同的对象,提高代码的复用性。
-
需要解耦客户端和具体实现:当客户端需要使用某个类的实例化对象时,但是该类的实例化过程比较复杂或者需要依赖于其他的类时,为了避免客户端与具体实现紧密耦合,可以采用工厂模式进行对象的创建。
-
需要动态地切换实现:当需要根据不同的条件来动态地切换产品实现时,可以使用工厂模式。通过定义抽象工厂接口,在具体工厂类中选择不同的实现,从而实现动态切换。
-
需要隐藏具体实现细节:当需要隐藏具体实现细节时,可以使用工厂模式。通过将具体实现封装在工厂类中,客户端无法访问实际的构造方法,从而隐藏了具体实现的细节。
总之,工厂模式是一种常用的设计模式,适用于需要创建复杂对象、需要解耦客户端和具体实现、需要动态地切换实现或需要隐藏具体实现细节等场景。