简单工厂设计模式属于创建型模式,简单工厂设计模式并不属于GoF的23种设计模式里面,但是因为其在某些场景下使用起来非常方便,因此也是一门必须掌握的模式。创建型设计模式解决的就是对象的创建问题,对象创建在Java中不就是new吗,这有什么问题呢?
new关键字直接涉及到了具体的类(接口和抽象类是不能实例化的),因此这就导致了一旦客户端代码中依赖的某个第三方类发生了改变,那么客户端代码也必须改变,代码的耦合度变高,不符合开闭原则。
因此通过简单工厂模式,客户端不需要直接通过new关键字来创建对象,而是通过一个简单工厂类来进行对象的实例化,简单工厂中封装了产品类的创建过程,客户端只需要和简单工厂类做好约定即可,产品类的创建细节完全屏蔽于简单工厂类中,可以实现客户端代码和产品类的解耦。
简单工厂中包含如下几个角色:

package simplefactory;
public abstract class AbstractProduct {
/**
* @return 返回产品的用法
*/
public abstract String getProductUsage();
}
package simplefactory;
public class ConcreteProductA extends AbstractProduct {
@Override
public String getProductUsage() {
return "ConcreteProductA的使用方法";
}
}
package simplefactory;
public class ConcreteProductB extends AbstractProduct {
@Override
public String getProductUsage() {
return "ConcreteProductB的用法";
}
}
package simplefactory;
public class SimpleFactory {
public static AbstractProduct createProduct(String type) {
switch (type) {
case "ConcreteProductA":
return new ConcreteProductA();
case "ConcreteProductB":
return new ConcreteProductB();
default:
throw new RuntimeException("未知产品类型");
}
}
}
package simplefactory;
public class Client {
public static void main(String[] args) {
AbstractProduct product = SimpleFactory.createProduct("ConcreteProductA");
System.out.println(product.getProductUsage());
}
}
简单工厂模式,故名思义就是简单,在产品类不是很多的时候,使用简单工厂可以很好的将产品类的创建和客户端代码解耦合,只要客户端和简单工厂创建产品的接口约定不变,那么产品类的创建细节可以随意改变。
简单工厂模式最大的问题就是扩展性问题,如果产品类别比较少,或者类别数目变化不大,那么使用简单工厂模式可以很好的对程序解耦,但是一但需要增加或者减少大量的产品类的时候,必须要修改简单工厂的代码,这不符合程序的开闭原则,同时简单工厂的职责过重,一个工厂类负责多个产品的创建,也违背了单一职责原则。