一、简介
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
接着,我们定义三个具体产品类
ProductA
、ProductB
和ProductC
,它们都实现了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
分别创建ProductA
、ProductB
、ProductC
三个具体产品的实例,并调用它们的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();
}
}
执行结果:
三、解析
在上述示例中,我们使用了简单工厂模式来创建不同的产品对象。下面是对这些代码的解析:
- 抽象产品接口
IProduct
:定义了一个抽象的使用方法use()
,留给具体产品类去实现。- 具体产品类
ProductA
、ProductB
和ProductC
:实现了IProduct
接口,并实现了use()
方法,用于生产不同的产品。- 简单工厂类
SimpleFactory
:包含一个静态的工厂方法createProduct()
,根据传入的参数来创建不同的产品实例。- 测试方法
test()
:使用SimpleFactory
分别创建ProductA
、ProductB
、ProductC
三个具体产品的实例,并调用它们的use()
方法。
四、总结
简单工厂模式将对象的创建与使用分离,使得应用程序更容易维护和扩展。在使用简单工厂模式时,我们需要定义一个抽象产品接口,多个具体产品类实现这个接口,一个工厂类根据传入的参数来创建不同的产品对象。但是,它的缺点是它并没有很好地解决对象的创建问题,因为它只是将对象的创建过程移动到了工厂类中。如果我们需要创建更多的产品,那么我们需要不断地修改工厂类的代码,这会导致工厂类变得越来越复杂。