Java设计模式-工厂模式

文章目录

背景

众所周知,工厂模式分为简单工厂、工厂模式和抽象工厂模式。简单工厂模式由于太简单了,不予理会。本章节用一个实例将工厂模式和抽象工厂模式穿插起来。
机战世界中,机体是战争中最重要的一环。我们需要考虑这个问题,我方的机体是怎么生产出来的?其实我们不必想得太复杂,机体就是从工厂里面生产出来的。但由于一个机体的造价高昂,每一种机体都有其特定的工厂去生产。比如,古铁就由古铁工厂生产,白骑士就由白骑士工厂生产。这些工厂又有其代工厂,比如属性工厂,提供特殊能力和地形适应度(可以把这些属性当成芯片,属性工厂就是造芯片的)等属性(有很多属性,我只举其中两个属性)的生产。废话少说,现在来看下一架古铁是怎么被生产出来的吧!

实现

生产机体的工厂我们应用了工厂模式;
生产机体属性的工厂我们应用了抽象工厂模式
机体抽象类

/**
 * 机体
 */
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,这个例子可能有点不贴切,达到目的就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值