[java-design-patterns]Enum和Factory模式的替换

设计模式合集git笔记系列。

abstract factory模式的介绍

  1. 创建了KingdomFactory的接口
  2. 分别实现了ElfKingdomFactory和OrcKingdomFactory
  3. 为每个KingdomFactory声明了相应的enum
  4. 声明了KingdomFactory的Factory,根据enum返回对应的KingdomFactory

这个流程,诞生自Java还是弱鸡语言的时代,语言特性很弱。问题就在于KingdomFactory不仅有一个类(1),还要再声明一个enum(2),并添加到switch-case中(3),共三步不得不说怪麻烦的。之前同事曾经通过Annotation-processing把2、3步通过生成代码自动化掉,可以极大的简化工作,但是不是还有更好的办法?下面会在原文基础上增加一个Kingdom类,用来简化代码。

如果enum所在module能够依赖所有KingdomFactoryImpl的module,直接用enum实现KingdomFactory接口,使用lambda表达式传递不同实现:

public enum Factory implement KingdomFactory{
    ELF(()->new ElfCastle(), ()-> new ElfKing(), ()-> new ElfArmy()),
    ORC(...);
    private Function<Void, Castle> mCastleCreator;
    private Function<Void, King> mKingCreator;
    private Function<Void, Army> mArmyCreator;

    Factory(Function<Void, Castle> castleCreator, Function<Void, King> kingCreator, Function<Void, Army> armyCreator){
        mCastleCreator = castleCreator;
        ...
    }
    public Kingdom create(){
        return new Kingdom(mCastleCreator.create(), mKingCreator.create(), mArmyCreator.create());
    }
}

上面的方法是真正的单点修改,即增加一个Factory只需要在这个enum里增加一项即可。但是,引入了依赖,ElfCastle这些接口实现本来可以通过KingdomFactory的存在而不对外暴露。

如果希望隐藏所有实现(其实我看来这个是Factory的目标),可以把KingdomFactory的Factory声明成enum,干掉第三步。

public enum FOF implement KingdomFactory{
    ELF(new ElfKingdomFactory()),
    ORC(new OrcKingdomFactory());

    private KingdomFactory mFactory;
    FOF(KingdomFactory factory){
        mFactory = factory;
    }
    ...// proxy KingdomFactory的各种方法
}

这样可以隐藏同样多的实现,但减少了修改点。也避免了annotation-processing的麻烦和盲调生成代码的尴尬。不论如何,比原始的模式还是好不少的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值