1、概念
简单工厂模式属于创建型模式,但不属于23种GOF设计模式之一,称为静态工厂方法(Static Factory Method)模式,可以根据参数的不同返回不同的类实例。
2、模式结构
- Factory(工厂角色):负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
- Product(抽象产品角色):负责描述所有实例所共有的公共接口。
- ConcreteProduct(具体产品角色):创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
3、使用场景
- 工厂类负责创建的对象比较少,不会造成工厂方法中的业务太复杂;
- 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心,不需要关系创建细节;
- 很容易违反高内聚责任分配原则,只在业务很简单的情况使用。
4、优缺点
优点:
- 创建和使用分开,无需关心对象如何创建,实现解耦
- 在工厂初始化具体对象,代码容易维护,符合面向接口编程原则
- 引入配置文件,可不修改代码修改和增加具体类对象,增加灵活性
缺点:
- 工厂类代码过重,集中了所有具体类对象创建,一旦不能正常工作,整个系统都要受到影响
- 工厂类违反了高内聚责任分配原则
- 系统开展困难,添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护
- 使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构
5、实例
创建抽象产品类,定义具体产品的公共接口
public abstract class AbsPhone {
abstract String getName();
abstract void setTheme();
}
创建具体产品类(继承抽象产品类),定义生产的具体产品
public class HuaweiPhone extends AbsPhone {
private String name = "Huawei";
@Override
String getName() {
return name;
}
@Override
void setTheme() {
// 根据手机设置不同主题
}
}
public class XiaomiPhone extends AbsPhone {
private String name = "Xiaomi";
@Override
String getName() {
return name;
}
@Override
void setTheme() {
// 根据手机设置不同主题
}
}
创建工厂类,通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例
public class Factory {
public static AbsPhone createPhone(String type) throws Exception {
AbsPhone phone = null;
switch (type) {
case "Huawei":
phone = new HuaweiPhone();
break;
case "Xiaomi":
phone = new HuaweiPhone();
break;
}
if (phone == null) {
throw new Exception("传入参数不正确");
}
return phone;
}
}