第一篇 生成及初始化对象 第三章 - 抽象工厂模式
我们继续引用《草虫》中的故事。这里不仅有主人公采摘野菜的场景,还有她对心上人的思念。
// “采摘”接口
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();
}
}
这里增加了抽象工厂,用作“蕨”工厂和“薇”工厂的父类。
使用时,先选择具体工厂,再用该工厂生成单一特性的目标对象。

浙公网安备 33010602011771号