简单工厂模式
定义
简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在 GoF 23 种设计模式之列。简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式又叫作静态工厂方法模式。
优点
工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确。
客户端无需知道所创建具体产品的类名,只需要知道参数即可。
也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。
缺点
简单工厂模式的工厂类单一,负责所有产品的创建,责任过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度。
系统扩展困难,一旦增加新的产品不得不修改工厂逻辑,在产品类型较多的时候,可能造成逻辑过于复杂。
简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构。
应用场景
对于产品类相对较少的情况,考虑使用简单工厂模式,使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关系如何创建对象的逻辑,可以方便的创建所需产品。
实现
简单工厂类:是简单工厂模式的核心,负责实现创建所有实例的内部逻辑,工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
public class SimpleFactory {
public static Product getProduct(int type) {
switch (type) {
case 0:
return new ProductA();
case 1:
return new ProductB();
}
return null;
}
}
抽象产品:是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
public interface Product {
void show();
}
具体产品:是简单工厂模式的创建目标。
public class ProductA implements Product {
@Override
public void show() {
System.out.println("展示产品A");
}
}
public class ProductB implements Product{
@Override
public void show() {
System.out.println("展示产品B");
}
}