最近写一个关于代码沙箱的项目,用到了工厂模式,简单记个笔记,总结一下。
/**
* 代码沙箱创建工厂:根据字符串参数创建指定的代码沙箱实例
* 此处使用静态工厂模式,实现简单,符合此次需求
*/
public class CodeSandboxFactory {
/**
* 创建代码沙箱实例
* @return type 沙箱类型
*/
public static CodeSandbox newInstance(String type) {
switch (type){
case "example":
return new ExampleCodeSandbox();
case"remote":
return new RemoteCodeSandbox();
case "thirdParty":
return new ThirdPartyCodeSandbox();
default:
return new ExampleCodeSandbox();
}
}
}
实现了一个简单的静态工厂方法,根据传入的字符串参数创建不同类型的代码沙箱实例。这种方式的好处是简洁、易于理解,而且适用于需求较简单的场景。不过,它的扩展性在面对大量沙箱类型时可能不如其他更复杂的工厂模式。
-
newInstance
方法: 这是工厂方法的核心,接收一个String type
参数,根据该参数选择不同的沙箱类型并返回相应的实例。 -
使用
switch
语句:- 根据传入的
type
字符串,选择对应的代码沙箱实现类。 - 如果
type
是"example"
,则返回ExampleCodeSandbox
类的实例。 - 如果
type
是"remote"
,则返回RemoteCodeSandbox
类的实例。 - 如果
type
是"thirdParty"
,则返回ThirdPartyCodeSandbox
类的实例。 - 如果传入其他值,则返回
ExampleCodeSandbox
,作为默认实现。
- 根据传入的
-
代码沙箱实例: 该方法返回的
CodeSandbox
是一个接口或抽象类,具体的实现类(如ExampleCodeSandbox
、RemoteCodeSandbox
、ThirdPartyCodeSandbox
)应该实现了该接口或继承了该类。
工厂模式(Factory Pattern) 是一种创建型设计模式,其主要目的是将对象的创建过程封装起来,使得客户端代码不需要直接知道如何创建对象,而是通过工厂来生成对象。工厂模式帮助我们解耦客户端与对象的创建过程,从而提高系统的灵活性、可扩展性和可维护性。
工厂模式的分类:
工厂模式有多种实现方式,常见的包括:
1.简单工厂模式(Simple Factory Pattern)
在简单工厂模式中,工厂类根据传入的参数(通常是字符串或其他标识符)来决定实例化哪种类型的对象。客户端只需调用工厂方法获取对象,而不关心具体如何创建。
public class AnimalFactory {
public static Animal createAnimal(String type) {
switch (type) {
case "dog":
return new Dog();
case "cat":
return new Cat();
default:
throw new IllegalArgumentException("Unknown animal type");
}
}
}
优点:
- 客户端代码不需要了解具体的类实现,只需要依赖工厂提供的接口。
- 简单易懂,适用于创建对象较少且不需要变化的场景。
缺点:
- 当产品种类增多时,工厂类会变得越来越复杂,难以维护。
- 新增产品时需要修改工厂类,违反了“开放封闭原则”。
2.工厂方法模式(Factory Method Pattern)
工厂方法模式将工厂类抽象为接口或抽象类,具体的创建对象的工作交给子类来实现。每个具体工厂类都负责创建一种特定类型的对象。
// 抽象产品
public interface Animal {
void speak();
}
// 具体产品类
public class Dog implements Animal {
public void speak() {
System.out.println("Woof");
}
}
public class Cat implements Animal {
public void speak() {
System.out.println("Meow");
}
}
// 抽象工厂类
public abstract class AnimalFactory {
public abstract Animal createAnimal();
}
// 具体工厂类
public class DogFactory extends AnimalFactory {
public Animal createAnimal() {
return new Dog();
}
}
public class CatFactory extends AnimalFactory {
public Animal createAnimal() {
return new Cat();
}
}
优点:
- 遵循“开放封闭原则”,新增产品时无需修改现有代码,只需扩展工厂类。
- 每个工厂类只负责创建一种产品,结构更加清晰。
缺点:
- 每个产品都需要一个相应的工厂类,增加了系统的复杂性。
3.抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式用于创建一系列相关的对象。它定义了多个产品类别(产品族),每个类别的具体产品由具体工厂类来创建。抽象工厂模式适用于需要提供一组产品的场景,每一组产品都是相互关联的。
// 抽象产品A
public interface Button {
void render();
}
// 抽象产品B
public interface Checkbox {
void render();
}
// 具体产品A1
public class WindowsButton implements Button {
public void render() {
System.out.println("Rendering Windows Button");
}
}
public class MacButton implements Button {
public void render() {
System.out.println("Rendering Mac Button");
}
}
// 具体产品B1
public class WindowsCheckbox implements Checkbox {
public void render() {
System.out.println("Rendering Windows Checkbox");
}
}
public class MacCheckbox implements Checkbox {
public void render() {
System.out.println("Rendering Mac Checkbox");
}
}
// 抽象工厂
public interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
// 具体工厂
public class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
public class MacFactory implements GUIFactory {
public Button createButton() {
return new MacButton();
}
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
优点:
- 符合“开放封闭原则”:可以通过扩展工厂类来支持新的产品族。
- 支持创建一组相关的产品,并且这些产品是相互配合工作的。
缺点:
- 当产品种类增加时,需要为每一种产品族创建一个新的工厂类,导致系统复杂度增加。
工厂模式的主要目的是封装对象的创建过程,将其从客户端代码中分离出来,增加了代码的灵活性和可扩展性。根据具体的需求,可以选择不同类型的工厂模式:
- 简单工厂模式:适合产品种类较少且不需要频繁变化的场景。
- 工厂方法模式:适合产品种类可能扩展,且每种产品有独立工厂类的场景。
- 抽象工厂模式:适用于需要创建一组相关产品的场景,确保产品之间的兼容性。
工厂模式可以有效地解耦对象的创建过程,使得代码更加模块化、可扩展和可维护。
解耦(Decoupling)是软件设计中的一个重要概念,指的是将系统的不同组件或模块之间的依赖关系减到最小,从而使得各个组件或模块之间的联系变得松散,尽可能减少它们之间的直接依赖。