背景
众所周知,工厂模式分为简单工厂、工厂模式和抽象工厂模式。简单工厂模式由于太简单了,不予理会。本章节用一个实例将工厂模式和抽象工厂模式穿插起来。
机战世界中,机体是战争中最重要的一环。我们需要考虑这个问题,我方的机体是怎么生产出来的?其实我们不必想得太复杂,机体就是从工厂里面生产出来的。但由于一个机体的造价高昂,每一种机体都有其特定的工厂去生产。比如,古铁就由古铁工厂生产,白骑士就由白骑士工厂生产。这些工厂又有其代工厂,比如属性工厂,提供特殊能力和地形适应度(可以把这些属性当成芯片,属性工厂就是造芯片的)等属性(有很多属性,我只举其中两个属性)的生产。废话少说,现在来看下一架古铁是怎么被生产出来的吧!
实现
生产机体的工厂我们应用了工厂模式;
生产机体属性的工厂我们应用了抽象工厂模式
机体抽象类
/**
* 机体
*/
public abstract class Robot {
public abstract void desc();
}
机体抽象工厂
/**
* 机器人工厂:造机器人的
*/
public interface RobotFactory {
public Robot createRobot();
}
古铁
/**
* 古铁机体(又MkIII)
*/
public class AncientIron extends Robot {
// 特殊能力
private SpecialAbility specialAbility;
// 地形适应度
private TerrainAdaptation terrainAdaptation;
private RobotAttributeFactory factory;
public AncientIron() {
super();
this.factory = new AncientIronAttributeFactory();
this.specialAbility = factory.createSpecialAbility();
this.terrainAdaptation = factory.createTerrainAdaptation();
}
@Override
public void desc() {
System.out.println("我是古铁,一切装甲只有被击破的命运!");
specialAbility.desc();
terrainAdaptation.desc();
}
}
古铁工厂
/**
* 这是古铁的量产工厂,我们会生产很多很多
*/
public class AncientIronFactory implements RobotFactory {
@Override
public Robot createRobot() {
return new AncientIron();
}
}
白骑士
/**
* 机体:白骑士
*/
public class WhiteKnight extends Robot {
private SpecialAbility specialAbility;
private TerrainAdaptation terrainAdaptation;
private RobotAttributeFactory factory;
public WhiteKnight() {
super();
this.factory = new WhiteKnightAttributeFactory();
this.specialAbility = factory.createSpecialAbility();
this.terrainAdaptation = factory.createTerrainAdaptation();
}
@Override
public void desc() {
System.out.println("我是白骑士,空中远程作战能力强得一比!");
specialAbility.desc();
terrainAdaptation.desc();
}
}
白骑士工厂
/**
* 这是白骑士的量产工厂,嗯,虽然白骑士不是量产的,但是为这么好的机体单独建一个工厂还是值得的~
*/
public class WhiteKnightFactory implements RobotFactory {
@Override
public Robot createRobot() {
return new WhiteKnight();
}
}
特殊能力
/**
* 特殊能力
*/
public interface SpecialAbility {
public void desc();
}
地形适应度
/**
* 地形适应性
* 注:指的是对海陆空宇(宙)的适应能力
*/
public interface TerrainAdaptation {
public void desc();
}
机体属性工厂
/**
* 机体属性工厂
*/
public interface RobotAttributeFactory {
/**
* 特殊能力
*/
public SpecialAbility createSpecialAbility();
/**
* 地形适应度
*/
public TerrainAdaptation createTerrainAdaptation();
}
古铁特殊能力芯片
/**
* 古铁的特殊能力芯片
*/
public class AncientIronSpecialAbility implements SpecialAbility {
@Override
public void desc() {
System.out.println("特殊能力:HP回复(小)、EN回复(小)");
}
}
古铁地形适应度芯片
/**
* 古铁地形适应性芯片
*/
public class AncientIronTerrainAdaptation implements TerrainAdaptation {
@Override
public void desc() {
System.out.println("地形适应度:海:S 陆:S 空:A 宇:B");
}
}
白骑士特殊能力芯片
/**
* 白骑士的特殊能力芯片
*/
public class WhiteKnightSpecialAbility implements SpecialAbility {
@Override
public void desc() {
System.out.println("特殊能力:分身");
}
}
白骑士地形适应度芯片
/**
* 白骑士地形适应性芯片
*/
public class WhiteKnightTerrainAdaptation implements TerrainAdaptation {
@Override
public void desc() {
System.out.println("地形适应度:海:A 陆:A 空:A 宇:B");
}
}
古铁属性工厂
/**
* 古铁属性工厂
*/
public class AncientIronAttributeFactory implements RobotAttributeFactory {
@Override
public SpecialAbility createSpecialAbility() {
return new AncientIronSpecialAbility();
}
@Override
public TerrainAdaptation createTerrainAdaptation() {
return new AncientIronTerrainAdaptation();
}
}
白骑士属性工厂
/**
* 白骑士属性工厂
*/
public class WhiteKnightAttributeFactory implements RobotAttributeFactory {
@Override
public SpecialAbility createSpecialAbility() {
return new WhiteKnightSpecialAbility();
}
@Override
public TerrainAdaptation createTerrainAdaptation() {
return new WhiteKnightTerrainAdaptation();
}
}
总结
虽然看起来我们需要依赖很多工厂,实际上我们只需要关注机体工厂能不能按时给我们成品,机体属性工厂我们无需关心,至于工厂是怎么造机体的,我们无从关心。因为我们需要把时间用在如何打胜仗,而不是这种琐事。
~侃了那么多废话,by the way,这个例子可能有点不贴切,达到目的就行了。