0
点赞
收藏
分享

微信扫一扫

设计模式二:工厂模式之简单工厂

一、简介

1.1 什么是简单工厂模式

在软件开发中,我们经常需要根据不同的需求创建不同的对象或者实例,为了实现这一目的,我们通常会采用工厂模式。工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。

工厂模式分为简单工厂、工厂方法和抽象工厂三种,本文将重点介绍简单工厂模式。

简单工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。简单工厂模式的核心思想是定义一个工厂类,根据用户选择的条件来返回一个产品类的实例。这种模式属于创建型模式,它提供了一种创建对象的最佳方式。

1.2 简单工厂模式的组成部分

简单工厂模式包含三个主要组成部分:

  • 抽象产品类:定义产品的属性和功能。
  • 具体产品类:实现抽象产品类中定义的属性和功能。
  • 工厂类:根据用户的选择条件来创建具体产品类的实例。

1.3 简单工厂模式的应用场景

简单工厂模式适用于以下场景:

  • 需要创建的对象较少。
  • 客户端不关心对象的创建过程。
  • 客户端只知道传入工厂类的参数,而不知道具体的产品类。

1.4 简单工厂模式的优缺点

1.4.1 优点:

  • 简单工厂模式具有很好的封装性,客户端不需要知道具体的产品类。
  • 工厂类根据客户端的选择条件来创建具体产品类的实例,使得客户端代码更加简洁。

1.4.2 缺点:

  • 简单工厂模式的工厂类负责所有产品类的创建,如果产品类过多,工厂类的代码会变得很复杂。
  • 新增产品类时,需要修改工厂类的源代码,违背了开闭原则。

二、示例

我们通过一个简单的例子来说明简单工厂模式的使用。

我们将使用简单工厂模式来创建三种不同的产品:ProductA、ProductB和ProductC。

2.1 定义一个抽象产品接口

首先,我们定义一个抽象产品接口IProduct,这个接口中包含一个抽象的use()方法,留给实现类去实现。

/**
 * 定义一个抽象产品接口
 */
public interface IProduct {
	// 定义一个抽象的使用方法,留给实现类去实现
	void use();
}

2.2 定义三个具体产品A、B和C

接着,我们定义三个具体产品类ProductAProductBProductC,它们都实现了IProduct接口,并且实现了use()方法。


产品A

import com.qfx.modules.factory.model.IProduct;

/**
 * 定义一个产品A
 */
public class ProductA implements IProduct {

	@Override
	public void use() {
		// 实现了抽象产品接口定义的use方法
		System.out.println("生产 ProductA");
	}
}

产品B

import com.qfx.modules.factory.model.IProduct;

/**
 * 定义一个产品B
 */
public class ProductB implements IProduct {

	@Override
	public void use() {
		// 实现了抽象产品接口定义的use方法
		System.out.println("生产 ProductB");
	}
}

产品C

import com.qfx.modules.factory.model.IProduct;

/**
 * 定义一个产品C
 */
public class ProductC implements IProduct {

	@Override
	public void use() {
		// 实现了抽象产品接口定义的use方法
		System.out.println("生产 ProductC");
	}
}

2.3 定义一个简单工厂类

然后,我们定义一个简单工厂类SimpleFactory,这个类中包含一个静态的工厂方法createProduct(),根据传入的参数来创建不同的产品实例。在这个示例中,我们使用字符串类型的参数来区分不同的产品。

import com.qfx.modules.factory.model.IProduct;
import com.qfx.modules.factory.model.impl.ProductA;
import com.qfx.modules.factory.model.impl.ProductB;
import com.qfx.modules.factory.model.impl.ProductC;

/**
 * 工厂模式(简单工厂模式)
 */
public class SimpleFactory {
	// 定义一个静态的工厂方法,用于根据传入的参数创建不同的产品实例
	public static IProduct createProduct(String type) {
        if ("A".equals(type)) {
        	// 根据传入的参数创建产品A的实例
            return new ProductA();
        } else if ("B".equals(type)) {
        	// 根据传入的参数创建产品B的实例
            return new ProductB();
        } else if ("C".equals(type)) {
        	// 根据传入的参数创建产品B的实例
            return new ProductC();
        } else {
        	return null;
        }
    }
}

2.4 客户端调用

最后,我们编写一个测试方法test(),在这个方法中,我们使用SimpleFactory分别创建ProductAProductBProductC三个具体产品的实例,并调用它们的use()方法。

import org.springframework.stereotype.Service;

import com.qfx.modules.factory.model.IProduct;
import com.qfx.modules.factory.simpleFactory.SimpleFactory;

/**
 * 简单工厂模式测试
 */
@Service
public class SimpleFactoryDemoTest {
	
	/**
	 * 该方法类用于测试简单工厂模式的功能:
	 * 它使用SimpleFactory分别生产ProductA、ProductB、ProductC三个具体产品,并调用它们的use()方法。
	 */
	public static void main(String[] args) {
		// 根据传入参数生成产品A实例
		IProduct productA = SimpleFactory.createProduct("A");
		// 调用ProductA实例的use方法
        productA.use();
        
        // 根据传入参数生成产品B实例
        IProduct productB = SimpleFactory.createProduct("B");
        // 调用ProductB实例的use方法
        productB.use();
        
        // 根据传入参数生成产品C实例
        IProduct productC = SimpleFactory.createProduct("C");
        // 调用ProductC实例的use方法
        productC.use();
	}
}

执行结果:

设计模式二:工厂模式之简单工厂_Java

三、解析

在上述示例中,我们使用了简单工厂模式来创建不同的产品对象。下面是对这些代码的解析:

  • 抽象产品接口IProduct:定义了一个抽象的使用方法use(),留给具体产品类去实现。
  • 具体产品类ProductAProductBProductC:实现了IProduct接口,并实现了use()方法,用于生产不同的产品。
  • 简单工厂类SimpleFactory:包含一个静态的工厂方法createProduct(),根据传入的参数来创建不同的产品实例。
  • 测试方法test():使用SimpleFactory分别创建ProductAProductBProductC三个具体产品的实例,并调用它们的use()方法。

四、总结

简单工厂模式将对象的创建与使用分离,使得应用程序更容易维护和扩展。在使用简单工厂模式时,我们需要定义一个抽象产品接口,多个具体产品类实现这个接口,一个工厂类根据传入的参数来创建不同的产品对象。但是,它的缺点是它并没有很好地解决对象的创建问题,因为它只是将对象的创建过程移动到了工厂类中。如果我们需要创建更多的产品,那么我们需要不断地修改工厂类的代码,这会导致工厂类变得越来越复杂。



举报

相关推荐

0 条评论