一、介绍
简单工厂模式是对对象创建最简单,最单薄的管理方式,只是对不同对象的创建进行了简单封装,通过向工厂传递类型来指定要创建的对象。
二、案例
以模拟手机制造举例说明:
- 手机制造标准
/**
* 手机制造标准
*
* @author zhangxs
**/
public interface Phone {
void make();
}
- 苹果手机具体制造实现
/**
* 苹果手机
*
* @author zhangxs
**/
public class ApplePhone implements Phone {
public ApplePhone() {
this.make();
}
@Override
public void make() {
System.out.println("已制造苹果手机...");
}
}
- 华为手机具体制造实现
/**
* 华为手机
*
* @author zhangxs
**/
public class HuaweiPhone implements Phone {
public HuaweiPhone() {
this.make();
}
@Override
public void make() {
System.out.println("已制造华为手机...");
}
}
- 小米手机具体制造实现
/**
* 小米手机
*
* @author zhangxs
**/
public class XiaomiPhone implements Phone {
public XiaomiPhone() {
this.make();
}
@Override
public void make() {
System.out.println("已制造小米手机...");
}
}
- 工厂支持制造的品牌枚举
/**
* 支持的品牌
*
* @author zhangxs
**/
public enum SupportBrand {
/** 华为 */
HUAWEI,
/** 苹果 */
APPLE,
/** 小米 */
XIAOMI
}
- 工厂
/**
* 手机工厂类
*
* @author zhangxs
**/
public class PhoneFactory {
public Phone makePhone(SupportBrand supportBrand) {
// 使用枚举接收类型参数的好处是调用者必须传入枚举类型参数,不会传任意参数,提高条件判断可控性
if (SupportBrand.HUAWEI.equals(supportBrand)) {
return new HuaweiPhone();
} else if (SupportBrand.XIAOMI.equals(supportBrand)) {
return new XiaomiPhone();
} else if (SupportBrand.APPLE.equals(supportBrand)) {
return new ApplePhone();
} else {
throw new RuntimeException("不支持的手机类型!!!");
}
}
}
- 测试
/**
* 测试
*
* @author zhangxs
**/
public class Test {
public static void main(String[] args) {
PhoneFactory factory = new PhoneFactory();
factory.makePhone(SupportBrand.APPLE);
factory.makePhone(SupportBrand.HUAWEI);
factory.makePhone(SupportBrand.XIAOMI);
factory.makePhone(null);
}
}
三、总结
- 优点:
1、工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确。
2、客户端无需知道所创建具体产品的类名,只需知道参数即可。
3、也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。 - 缺点:
1、简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
2、系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂 - 适用场景
对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。