简介
虽然简单工厂模式并不是GOF23中设计模式之一,但还是有必要了解一下。
为什么要使用简单工厂模式
通过简单工厂模式,可以将产品的实例化封装起来,调用者无需关心产品的实例化过程,只需使用工厂即可得到自己想要的产品。
什么是简单工厂模式
简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
别名
静态工厂方法(Static Factory Method)模式
类型:
类创建型模式
角色
角色
- 产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。
- 产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。
- 静态工厂。在编程中,工厂实现决定如何实例化产品。
UML类图
实现
- 创建一个产品接口IProduct.java
- 创建实现IProduct接口的产品类ProductA.java、ProductB.java
- 创建静态工厂类ProductFactory
- 创建测试类FactoryPatternDemo.java
产品接口
IProduct.java
public interface IProduct {
void get();
}
产品
ProductA.java
public class ProductA implements IProduct {
@Override
public void get() {
System.out.println("get ProductA");
}
}
ProductB.java
public class ProductB implements IProduct {
@Override
public void get() {
System.out.println("get ProductB");
}
}
工厂
ProductFactory.java
public class ProductFactory {
public IProduct getProduct(String productType) {
if ("ProductA".equalsIgnoreCase(productType)) {
return new ProductA();
} else if ("ProductB".equalsIgnoreCase(productType)) {
return new ProductB();
}
return null;
}
}
测试类FactoryPatternDemo.java
public class FactoryPatternDemo {
public static void main(String[] args) {
ProductFactory productFactory = new ProductFactory();
IProduct productA = productFactory.getProduct("ProductA");
productA.get();
IProduct productB = productFactory.getProduct("ProductB");
productB.get();
}
测试
get ProductA
get ProductB
优缺点
优点
- 封装。产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,调用者无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
缺点
违反了“开闭原则”。简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦。因为没有工厂接口,所以在工厂实现的扩展性方面稍弱。
适用环境
在以下情况下可以使用简单工厂模式:
- 工厂类负责创建的对象比较少。由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
- 客户端只需要传入工厂类的参数,对于如何创建对象不需要关心。客户端不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数即可创建对应产品。
使用场景
根据传入参数的不同构建不同类型的对象。比如,数据库访问,当用户不知道最后系统采用哪一类数据库,以及使用的数据库可能有变化时。如从Oracle切换到MySQL,只需要更改配置文件中的参数就可以了。PS:这里只是举个例子,面试的时候最好不要举这个例子。。。
问题
如果需求产生了变化,增加一个产品C,该如何办?
需要增加一个具体类,和修改工厂。简单工厂模式的问题就在于产品和工厂还是没有完全解耦,绑定在一起的。每当新增一种产品时,你都需要去维护工厂中的判断语句,造成的后果就是可能这个工厂类判断语句太过庞大,给扩展和维护带来很多麻烦。所以,简单工厂通过构造时传入的标识来生产产品,不同产品都在同一个工厂中生产,这种判断会随着产品的增加而增加,给扩展和维护带来麻烦。使用工厂模式可以解决这个问题。
在软件开发中,你在哪里用到了简单工厂模式?
面试的时候经常被问到,好好想想吧^^
本文已收录于专栏:24种设计模式