当前位置: 首页 > news >正文

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());
    }

}

使用场景

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

缺点

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

参考

  • Java Design Patterns

相关文章:

  • java计算机毕业设计基于安卓Android的数字猎头招聘管理APP
  • Flink 流处理API
  • 技术实践|开门见山谈Prometheus
  • npm包版本不一致的问题
  • JVM内存溢出问题排查
  • java计算机毕业设计门诊药品管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  • 真知灼见|客户视图与工作台:金融行业呼叫中心领域驱动设计
  • spring-task进行任务调度
  • npm实现格式化时间---就是实现时间按照要求输出--moment包
  • webdriver API进阶
  • 除自身以外数组的乘积、找到所有数组中消失的数字、两数之和
  • 四川农信分布式核心设计及验证项目成果专家评审会召开
  • 快速知识蒸馏的视觉框架-来自卡耐基梅隆大学等单位
  • c++ 11 线程支持 (std::promise)
  • 一篇文章带你看清C语言中的类型转换规则
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript实现分页效果
  • Logstash 参考指南(目录)
  • Selenium实战教程系列(二)---元素定位
  • 从重复到重用
  • 大快搜索数据爬虫技术实例安装教学篇
  • 机器学习 vs. 深度学习
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 一些css基础学习笔记
  • 一些关于Rust在2019年的思考
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 函数计算新功能-----支持C#函数
  • #Linux(Source Insight安装及工程建立)
  • #QT(TCP网络编程-服务端)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C#)获取字符编码的类
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (力扣)1314.矩阵区域和
  • (实战篇)如何缓存数据
  • (四)鸿鹄云架构一服务注册中心
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)fock函数详解
  • (转载)深入super,看Python如何解决钻石继承难题
  • .Net core 6.0 升8.0
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET 中创建支持集合初始化器的类型
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET构架之我见
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [20150904]exp slow.txt
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [ABC294Ex] K-Coloring
  • [ACTF2020 新生赛]Upload 1