第一篇 生成及初始化对象 第三章 - 抽象工厂模式

  我们继续引用《草虫》中的故事。这里不仅有主人公采摘野菜的场景,还有她对心上人的思念。

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

  public void harvest();

}

// “抒情”接口
public interface Expressible {

  public void express();

}

// 蕨
public class Jue implements Harvestable, Expressible {

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

  public void express() {
    // 未见君子,忧心惙惙。
  }

}

// 薇
public class Wei implements Harvestable, Expressible {

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

  public void express() {
    // 未见君子,我心伤悲。
  }

}

  信息的维度增加了,对象也随之丰满起来。
  这里似乎有一个绕不开的趋势,客观世界的复杂性使对象倾向于变成多种信息和功能的综合体。
  对于复杂的对象,我们的使用原则是“分而治之”。
  如上所见,我们将“采摘”与“抒情”两个特性分离开来,并用不同的接口表示它们。采摘野菜时,只使用“采摘”接口;思念心上人时,只使用“抒情”接口。
  接下来扩充工厂类,生成目标对象。

// 抽象工厂类
public abstract class AbstractFactory {

  // 生成“采摘”对象
  public abstract Harvestable createHarvestable();
  // 生成“抒情”对象
  public abstract Expressible createExpressible();

}

// “蕨”工厂类
public class JueFactory extends AbstractFactory {

  @Override
  public Harvestable createHarvestable() {
    return new Jue();
  }

  @Override
  public Expressible createExpressible() {
    return new Jue();
  }

}

// “薇”工厂类
public class WeiFactory extends AbstractFactory {

  @Override
  public Harvestable createHarvestable() {
    return new Wei();
  }

  @Override
  public Expressible createExpressible() {
    return new Wei();
  }
}

// 测试类
public class Test {

  public void test() {
    AbstractFactory f = new JueFactory();// 创建“蕨”工厂
    Expressible o = f.createExpressible();// 生成“蕨”类“抒情”对象
    o.express();
  }

}

  这里增加了抽象工厂,用作“蕨”工厂和“薇”工厂的父类。
  使用时,先选择具体工厂,再用该工厂生成单一特性的目标对象。
  

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