第一篇 生成及初始化对象 第二章 - 工厂方法模式

  抽象类和接口有利于提升软件的扩展能力,然而它们不能用来实例化。
  看个例子。

// “采摘”接口
public interface Harvestable {

  public void harvest();

}

// 测试类
public class Test {
  Harvestable obj = new Harvestable();// 实例化失败
}

  由于缺少细节信息,系统无法生成“采摘”对象,编译器会抛出“Cannot instantiate the type Harvestable”警告。
  生成对象时必须依赖具体类的限制与我们想要使用抽象化类以提升软件扩展能力的意图天然相悖。
  有什么方法可以屏蔽具体类,以抽象方式生成对象吗?工厂方法模式可以派上用场。
  古诗《草虫》描写了一位姑娘采摘野菜的场景。我们以此为例,看看工厂方法模式提供的设计思路。

// 蕨
public class Jue implements Harvestable {

  public void harvest() {
    // 陟彼南山,言采其蕨。
  }

}

// 薇
public class Wei implements Harvestable {

  public void harvest() {
    // 陟彼南山,言采其薇。
  }

}

// 工厂类
public class Factory {

  public static Harvestable create(String name) {
    if ("蕨".equals(name)) {
      return new Jue();
    }
    if ("薇".equals(name)) {
      return new Wei();
    }
      throw new IllegalArgumentException();
  }

}

  Factory 是一个简单的工厂类,专门负责生成“采摘”对象。它的 create() 方法隐藏了具体类(Jue、Wei)的存在,对外提供了抽象的对象生成方式(入参为抽象的名词“蕨”或“薇”,而非具体的类名)。
  有些软件将实例化具体类的工作委托给了 Spring Framework,我们可以采用下面的写法。

// 蕨
@Component("蕨")
public class Jue implements Harvestable {

  public void harvest() {}

}

// 薇
@Component("薇")
public class Wei implements Harvestable {

  public void harvest() {}

}

// 工厂类
@Component("factory")
public class Factory {

  @Autowired
  private java.util.Map<String, Harvestable> map;

  public Harvestable get(String name) {// 方法入参为“蕨”或“薇”
    return map.get(name);
  }

}
posted on 2025-03-23 10:09  星辰河岳  阅读(48)  评论(0)    收藏  举报