Java Design Patterns 之 抽象工厂模式

提供一个用来创建一系列有依赖关系的对象,并且不用指定具体的类。

解释

现实世界

创建一个王国需要一系列共同主题的对象。比如创建一个精灵王国需要一个精灵国王、精灵城堡和精灵军队,创建兽人王国需要一个兽人国王、兽人城堡和兽人军队。王国之间的对象之间存在依赖关系

维基百科

抽象工厂模式提供了一种封装一组具有共同主题的独立工厂的方法,而无需指定他们具体的类。

总结

简单来说抽象工厂就是将独立的但是又互相有依赖关系的工厂组合在一起而不指定具体类的工厂。

示例

基础互相依赖接口

//国王类
public interface King {

    String getDescription();

}
//城堡类
public interface Castle {

    String getDescription();

}
//军队
public interface Army {

    String getDescription();

}

精灵

//精灵国王
public class ElfKing implements King {
    String description = "The elven king";


    @Override
    public String getDescription() {
        return description;
    }
}
//精灵城堡
public class ElfCastle implements Castle {

    String description = "The elven castle";

    @Override
    public String getDescription() {
        return description;
    }
}
//精灵军队
public class ElfArmy implements Army {
    String description = "The elven army";


    @Override
    public String getDescription() {
        return description;
    }
}

兽人

//兽人国王
public class OrishKing implements King {
    String description = "The Orcish king";

    @Override
    public String getDescription() {
        return description;
    }
}
//兽人城堡
public class OrishCastle implements Castle {
    String description = "The Orcish castle";
    
    @Override
    public String getDescription() {
        return description;
    }
}

//兽人军队
public class OrcishArmy implements Army {
    String description = "The Orcish army";
    @Override
    public String getDescription() {
        return description;
    }
}

工厂

public interface KingdomFactory {

    Castle createCastle();

    Army createArmy();

    King createKing();

}

精灵工厂

public  class ElfKingdomFactory implements KingdomFactory{

    @Override
    public Castle createCastle() {
        return new ElfCastle();
    }

    @Override
    public Army createArmy() {
        return new ElfArmy();
    }

    @Override
    public King createKing() {
        return new ElfKing();
    }
}

兽人工厂

public class OrcKingdomFactory implements KingdomFactory{

    @Override
    public Castle createCastle() {
        return new OrishCastle();
    }

    @Override
    public Army createArmy() {
        return new OrcishArmy();
    }

    @Override
    public King createKing() {
        return new OrishKing();
    }
}

抽象工厂

public static class FactoryMaker {

        enum KingdomType {
            /**
             * 精灵
             */
            ELF,
            /**
             * 兽人
             */
            ORC;
        }

        public static KingdomFactory makeKingdomFactory(KingdomType kingdomType) {

            switch (kingdomType) {
                case ORC:
                    return new OrcKingdomFactory();
                default:
                    return new ElfKingdomFactory();
            }

        }

}

使用

public class App {

    private static Kingdom kingdom = new Kingdom();

    public static void main(String[] args) {

        createKingdom(Kingdom.FactoryMaker.KingdomType.ELF);

        System.out.println(kingdom);
    }

    public static void createKingdom(Kingdom.FactoryMaker.KingdomType kingdomType){
        KingdomFactory kingdomFactory = Kingdom.FactoryMaker.makeKingdomFactory(kingdomType);
        kingdom.setArmy(kingdomFactory.createArmy());
        kingdom.setCastle(kingdomFactory.createCastle());
        kingdom.setKing(kingdomFactory.createKing());
    }

}

使用场景

  • 系统的相关产品对象需要一起使用,需要强制约束
  • 需要在运行时构造特定的依赖项
  • 需要在运行时才决定调用哪个对象
  • 需要提供一个或者多个在运行时才明确的参数,才能解决依赖关系
  • 当需要产品之间的一致性
  • 在添加新的产品或者产品系列时不希望更改现有代码

缺点

增加了代码的复杂性,工厂模式的引入带来了许多新的接口和类 。

参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹氿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值