简单工厂模式

153 阅读2分钟

定义:提供一个接口获取对象,而不必对外暴露创建对象的逻辑

假如要开一家炒饭店,炒饭的种类有:酱油炒饭,扬州炒饭,蛋炒饭,香肠炒饭,虾仁炒饭;

高级的程序员知道说要把炒饭做成接口,子类继承这个接口来实现不同的炒饭。这样就能在运行时通过接口来引用动态的初始化的子类,而不需要针对具体的子类编程。

interface FriedRice{
    public void prepare();
    
    public void fried();
}

class JiangYouFriedRice implements FriedRice {
    ...
}

class YangZhouFriedRice implements FriedRice {
    ...
}
...

实现一份具体炒饭的过程可能的代码如下:

public class Restaurant {
    
    public static void main(Stiring[] args) {
        String riceType = args[0];
        FriedRice friedRice;
        if ("JiangYouFriedRice".equals(riceType)) {
            friedRice = new JiangYouFriedRice();
        } else if ("YangZhouFriedRice".equals(riceType)) {
            friedRice = new YangZhouFriedRice();
        }
         ...
        friedRice.prepare();
        friedRice.fried();
    }
}

如果饭店炒饭类型增加,就需要修改这里的 if else 逻辑。当有的炒饭没人喜欢,需要去掉时,也需要修改这里的逻辑。这里的 if else 不仅不“优雅”,还是变化的点。

这时候很容易想到的就是,把这段代码迁移到另一个类中。例如下面的代码:

public class SimpleFriedRiceFactory {
    
    public static FriedRice getFriedRice(String type) {
        FriedRice friedRice;
        if ("JiangYouFriedRice".equals(riceType)) {
            friedRice = new JiangYouFriedRice();
        } else if ("YangZhouFriedRice".equals(riceType)) {
            friedRice = new YangZhouFriedRice();
        }
         ...
        friedRice.prepare();
        friedRice.fried();
    }
}

public class Restaurant {
    
    public static void main(Stiring[] args) {
        String riceType = args[0];
        FriedRice friedRice = SimpleFriedRiceFactory
            .getFriedRice(riceType);
    }
}

像这样把构建对象的复杂逻辑抽离出来,只对外暴露获取对象的接口的模式就是简单工厂模式。这里使用了静态方法,也可以叫做静态工厂方法。也可以不通过静态方法,而使用类来实现同样的功能。但静态方法的好处是,不需要实现具体的工厂类就能够对外提供需要构建的对象。