马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
简单工厂模式(Simple Factory Pattern)固然不属于 GoF 23 种经典操持模式,但在实际开发中非经常用,尤其是在 Spring Boot 项目中。它提供了一种简单的方式来创建对象,将对象的创建逻辑会合到一个工厂类中。
一、简单工厂模式的界说
简单工厂模式的核心头脑是:
- 界说一个工厂类 (Factory Class): 这个工厂类负责创建全部产物对象。
- 工厂类包罗一个静态方法 (Static Method): 这个静态方法根据传入的参数(通常是字符串范例或罗列范例),来决定创建哪种详细的产物对象。
- 客户端代码通过工厂类的静态方法获取产物对象: 客户端代码不须要直接利用 new 关键字创建对象,而是调用工厂类的静态方法,并传入相应的参数。
简单工厂模式的结构:
- 工厂类 (Factory): 负责创建全部产物对象的类。
- 抽象产物类/接口 (Product): 全部产物对象的共同父类或接口。
- 详细产物类 (ConcreteProduct): 工厂类创建的详细对象范例。
二、简单工厂模式的优缺点
- 优点:
- 简单易用: 实现简单,代码量少,轻易明白。
- 封装创建逻辑: 将对象的创建逻辑会合到工厂类中,客户端代码无需关心对象的创建细节。
- 低沉耦合度: 客户端代码不直接依靠于详细的产物类,而是依靠于工厂类和抽象产物类/接口。
- 缺点:
- 违背开闭原则: 当须要添加新的产物范例时,须要修改工厂类的代码(比方,添加新的 if-else 分支或 case 分支),这违背了开闭原则(对扩睁开放,对修改关闭)。
- 工厂类职责过重: 工厂类负责创建全部产物对象,如果产物种类很多,工厂类的代码会变得很巨大,难以维护。
- 可扩展性差: 由于违背开闭原则,简单工厂模式的可扩展性较差。
三、在 Spring Boot 中利用简单工厂模式
在 Spring Boot 中,你可以通过以下方式利用简单工厂模式:
- 直接利用静态方法:
- 创建一个工厂类,并在此中界说一个静态方法,根据参数创建差别的对象。
- // 抽象产品接口
- interface Product {
- void doSomething();
- }
- // 具体产品 A
- class ConcreteProductA implements Product {
- @Override
- public void doSomething() {
- System.out.println("ConcreteProductA");
- }
- }
- // 具体产品 B
- class ConcreteProductB implements Product {
- @Override
- public void doSomething() {
- System.out.println("ConcreteProductB");
- }
- }
- // 简单工厂类
- public class SimpleFactory {
- public static Product createProduct(String type) {
- if ("A".equals(type)) {
- return new ConcreteProductA();
- } else if ("B".equals(type)) {
- return new ConcreteProductB();
- } else {
- return null; // 或者抛出异常
- }
- }
- }
- // 使用
- public class Client {
- public static void main(String[] args) {
- Product productA = SimpleFactory.createProduct("A");
- productA.doSomething();
- Product productB = SimpleFactory.createProduct("B");
- productB.doSomething();
- }
- }
复制代码 - 团结 Spring 的 @Component 和 @Autowired:
- 将工厂类注册为 Spring Bean(利用 @Component 注解)。
- 在须要利用工厂的地方,通过 @Autowired 注入工厂 Bean。
- 这种方式可以更好地利用 Spring 的依靠注入功能。
- import org.springframework.stereotype.Component;
- // ... (Product 接口和 ConcreteProductA, ConcreteProductB 类保持不变) ...
- // 简单工厂类,使用 @Component 注册为 Spring Bean
- @Component
- public class SimpleFactory {
- public Product createProduct(String type) { // 不需要是静态方法了
- if ("A".equals(type)) {
- return new ConcreteProductA();
- } else if ("B".equals(type)) {
- return new ConcreteProductB();
- } else {
- return null;
- }
- }
- }
- // 使用
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- @Service
- public class Client {
- @Autowired
- private SimpleFactory simpleFactory; // 注入 SimpleFactory
- public void run() {
- Product productA = simpleFactory.createProduct("A");
- productA.doSomething();
- Product productB = simpleFactory.createProduct("B");
- productB.doSomething();
- }
- }
复制代码 - 利用罗列 (Enum) 实现单例的简单工厂:
- 如果你的产物对象是无状态的, 而且每种范例只须要一个实例,可以利用罗列来实现简单工厂,同时包管单例。
- interface Product {
- void doSomething();
- }
- // 具体产品 A
- class ConcreteProductA implements Product {
- @Override
- public void doSomething() {
- System.out.println("ConcreteProductA");
- }
- }
- // 具体产品 B
- class ConcreteProductB implements Product {
- @Override
- public void doSomething() {
- System.out.println("ConcreteProductB");
- }
- }
- // 使用枚举实现简单工厂
- enum ProductFactory {
- INSTANCE;
- public Product createProduct(String type) {
- if ("A".equals(type)) {
- return new ConcreteProductA();
- } else if ("B".equals(type)) {
- return new ConcreteProductB();
- } else {
- return null;
- }
- }
- }
- //使用
- Product product = ProductFactory.INSTANCE.createProduct("A");
复制代码 - 团结@Configuration和@Bean:
- 你可以利用 @Configuration 和 @Bean 注解来界说工厂方法,并将工厂方法创建的对象注册为 Spring Bean。 这种方式更符合 Spring 的设置风格。
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- // ... (Product 接口和 ConcreteProductA, ConcreteProductB 类保持不变) ...
- @Configuration
- public class AppConfig {
- @Bean
- public Product productA() { // 工厂方法,创建 ConcreteProductA
- return new ConcreteProductA();
- }
- @Bean
- public Product productB() { // 工厂方法,创建 ConcreteProductB
- return new ConcreteProductB();
- }
- // 你也可以定义一个更通用的工厂方法,根据参数创建不同的 Bean
- @Bean
- public Product product(@Value("${product.type}") String productType) {
- if("A".equals(productType)){
- return new ConcreteProductA();
- } else {
- return new ConcreteProductB();
- }
- }
- }
复制代码
四、利用场景
简单工厂模式实用于以了局景:
- 创建对象种类较少: 如果须要创建的对象种类不多,而且创建逻辑比力简单,可以利用简单工厂模式。
- 客户端不须要关心对象的创建细节: 客户端只须要知道怎样通过工厂类获取对象即可。
- 对象创建逻辑相对稳固: 如果对象的创建逻辑不经常变革,可以利用简单工厂模式。
五、与 Spring Boot 特性的团结
- @Component 和 @Autowired: 将工厂类注册为 Spring Bean,方便依靠注入。
- @Configuration 和 @Bean: 利用 @Bean 注解界说工厂方法,将工厂方法创建的对象注册为 Spring Bean。
- @Value: 可以利用 @Value 注解从设置文件中读取参数,转达给工厂方法,实现更机动的对象创建。
- @Conditional: 可以利用 @Conditional 注解(比方 @ConditionalOnProperty、@ConditionalOnClass 等)来根据条件决定是否创建某个 Bean,实现更机动的工厂设置。
六. 简单工厂模式退化为简单工具类
如果简单工厂模式中,工厂类只负责创建对象,没有任何其他的业务逻辑,那么这个工厂类实际上就退化成了一个简单的工具类。在这种情况下,是否利用工厂模式就看个人喜欢了,由于并没有带来特别大的利益,也没有显着的毛病。
总结
简单工厂模式是一种简单易用的创建型操持模式,它可以封装对象的创建逻辑,低沉代码耦合度。 在 Spring Boot 中,你可以通过多种方式利用简单工厂模式,并团结 Spring 的特性来实现更机动、更可维护的对象创建。 但是,须要留意简单工厂模式违背开闭原则的缺点,如果须要频仍添加新的产物范例,可以思量利用工厂方法模式或抽象工厂模式。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |