工厂模式(根据代码沙箱拓展)

最近写一个关于代码沙箱的项目,用到了工厂模式,简单记个笔记,总结一下。

/**
 * 代码沙箱创建工厂:根据字符串参数创建指定的代码沙箱实例
 * 此处使用静态工厂模式,实现简单,符合此次需求
 */
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 是一个接口或抽象类,具体的实现类(如 ExampleCodeSandboxRemoteCodeSandboxThirdPartyCodeSandbox)应该实现了该接口或继承了该类。


工厂模式(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)是软件设计中的一个重要概念,指的是将系统的不同组件或模块之间的依赖关系减到最小,从而使得各个组件或模块之间的联系变得松散,尽可能减少它们之间的直接依赖。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Adellle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值