什么是工厂模式
工厂模式(Factory Pattern)是一种创建型设计模式,它通过定义一个接口或抽象类来创建对象,但由子类决定具体实例化哪个类。简单来说,工厂模式将对象的实例化过程封装起来,客户端通过工厂方法来创建对象,而不需要直接使用 new 关键字。
工厂模式的目的是将对象的创建和使用解耦,使得客户端代码不需要关心具体对象的创建过程,尤其是对象的构造方式或者具体类型。
工厂模式的作用
- 解耦:客户端代码与具体的对象创建解耦,客户端只需要依赖工厂接口而不依赖具体的实现类。
- 代码重用:工厂方法可以提供统一的创建对象的逻辑,从而避免重复代码。
- 更好的扩展性:如果系统中需要新增不同的产品类,只需要添加新的工厂类即可,不需要修改原有的客户端代码。
- 灵活的对象管理:有些工厂模式可以实现对象的缓存或对象池,从而优化性能。
示例
不使用工厂模式获取实例
// 抽象产品:Button(按钮)
interface Button {
void render();
}
// 具体产品:WindowsButton(Windows 按钮)
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("Rendering a Windows Button");
}
}
// 具体产品:MacButton(Mac 按钮)
class MacButton implements Button {
@Override
public void render() {
System.out.println("Rendering a Mac Button");
}
}
// 客户端代码:根据操作系统类型选择不同按钮
public class Main {
public static void main(String[] args) {
Button button;
String osType = "Windows"; // 假设从配置中获取操作系统类型
if ("Windows".equalsIgnoreCase(osType)) {
button = new WindowsButton();
} else {
button = new MacButton();
}
button.render();
}
}
这里如果又新增一个liunx按钮 客户端又要重新修改代码
使用工厂模式
// 抽象产品:Button(按钮)
interface Button {
void render();
}
// 具体产品:WindowsButton(Windows 按钮)
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("Rendering a Windows Button");
}
}
// 具体产品:MacButton(Mac 按钮)
class MacButton implements Button {
@Override
public void render() {
System.out.println("Rendering a Mac Button");
}
}
// 具体产品:LinuxButton(Linux 按钮)
class LinuxButton implements Button {
@Override
public void render() {
System.out.println("Rendering a Linux Button");
}
}
// 抽象工厂:GUIFactory
interface GUIFactory {
Button createButton();
}
// 具体工厂:WindowsFactory
class WindowsFactory implements GUIFactory {
@Override
public Button