工厂模式分为 简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory Pattern)。有的说简单工厂模式是工厂方法模式的一种特例。
工厂模式属于类创建型模式,同属于创建型模式的还有单例模式,建造者模式。
简单工厂模式
简单工厂模式(Simple Factory Pattern)因为内部使用静态方法根据不同参数构造不同产品对象实例,也称静态工厂方法模式。
在简单工厂模式中,可以根据参数的不同返回不同实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式有三部分组成:工厂类,抽象产品,具体产品。
- 工厂类:是此模式的核心类,内部提供静态工厂方法,用于创建所需产品对象,可被外界直接调用。
- 抽象产品:是工厂类创建的所有对象的父类或共有的接口,封装各种产品对象的公有方法。
- 具体产品:是此模式的创建目标,每个具体产品都继承了抽象产品角色,实现抽象产品角色中的抽象方法。
简单工厂模式案例解析
案例情景:做饭,分为早饭,午饭。
/**
* 工厂类
*
* @author jinzifu
* @create 2018/2/23 14:41
*/
public class FoodFactory {
/**
* 工厂类静态方法
* @param type 产品类型参数
* @return
*/
public static IMakeFood getInstance(String type) {
IMakeFood iMakeFood = null;
if (type.equalsIgnoreCase("Breakfest")) {
iMakeFood = new Breakfest();
} else if (type.equalsIgnoreCase("Lunch")) {
iMakeFood = new Lunch();
}
return iMakeFood;
}
}
工厂类根据传入的参数实例化所需产品对象,并返回抽象产品的接口类型或抽象类型的实例,还可以负责产品对象的初始化工作以及一些资源和环境配置工作,例如连接数据库、创建文件等。
/**
* 抽象产品-做饭
*
* @author jinzifu
* @create 2018/2/22 17:54
*/
public interface IMakeFood {
/**
* 做饭
*/
void makeFood();
}
/**
* 具体产品类-做午饭
*
* @author jinzifu
* @create 2018/2/22 17:54
*/
public class Lunch implements IMakeFood {
@Override
public void makeFood() {
System.out.println("午饭");
}
}
具体产品类实现抽象产品接口或继承抽象产品类。
如果具体产品的创建需要复杂的配置和初始化,可继承抽象产品类并在父类共有方法中统一初始化。
外部测试及打印:
FoodFactory.getInstance("Lunch").makeFood();
午饭
简单工厂模式总结
- 简单工厂模式实现了对象的“创建”和“使用”的分离,遵循了“单一职责原则”,但增加新的产品对象时须修改工厂类静态方法,违背了“开闭原则”。
- 工厂类集中了所有产品创建逻辑(几乎是全能的),一旦不能工作,整个系统影响很大。
- 工厂类中使用了静态工厂方法,造成该类方法无法形成基于继承的等级结构。
针对简单工厂模式中出现的问题,我们做了一下优化,即工厂方法模式的引入。