感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考。

  前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来。本周周末会花时间整理出来,然后现在想的是白天更新一点并发编程,晚上回家学习设计模式。非科班出身,脑子也比较笨。博文都是自己根据学习的时候所想的思路,如果能有帮到各位的地方,那十分荣幸。如果有欠缺之处,希望能在评论中指出一起进步。好啦,开始正文了。

本套设计模式的博文,包含各种设计模式的定义、类型、适用场景及优缺点分析。并通过Coding去实际加深理论理解。

简单工厂:

  该模式本身使用于业务较为简单的情况,一般用于小项目或具体产品很少扩展的情况(这样工厂类不用经常修改)。

  定义可以归为一句话:由一个工厂对象决定创建出哪一种产品类的实例,它属于创建型模式,但并不属于GOF23种设计模式。

  组成角色:

    工厂类角色:本模式的核心,包含一定的商业逻辑和判断逻辑。根据逻辑不同,产生具体的工厂产品。

    抽象产品角色:一般是具体产品继承的父类或实现的接口。

    具体产品角色:工厂类所创建的对象就是此角色的实体,在java中由一个具体类实现。

  该模式适用场景:

    1、工厂类负责创建的对象比较少。

    2、客户端(应用层)只知道传入工厂类的参数。对于如何创建对象(逻辑)不关心。

  简单工厂-优点:

    只需要传入一个正确的参数,就可以获取你所需要的对象而无须知道其他创建细节

  简单工厂-缺点:

    工厂类的职责相对过重,增加新的产品。需要修改工厂类的判断逻辑,违背开闭原则

  实际上这都只是为了方便理解该模式做的铺垫。接下来通过Coding+小案例理解该模式。

  案例场景:

    对于学习编程现在有很多视频教学,我们现在有一个需求就是实现不同的课程录制不同的视频。那么我们对于案例来创建对应的角色。

    首先录制视频是一个公共的行为,那么我们将视频作为抽象的产品角色,创建一个视频抽象类Video,并编写一个produce的方法。

    

    对于不同的课程录制不同视频,我们可以创建具体的产品角色类。此处是JavaVideo和PythonVideo并继承Video,实现各自的功能。(我的截图真心很丑,大家凑合着看吧)

      

        

    此时我们通过应用层类Test来实现该需求。

    

    我们可以通过new 不同的对象,实现不同的视频录制。但这样会造成应用层要实现什么功能,就要去new对应的实现类。应用层过度依赖对应的类

    通过简单工厂的模式,我们解除应用层对这些实现类的依赖关系

    创建工厂类角色VideoFactory,通过工厂类去依赖对应的实现类。

    

    工厂类包含业务的判断逻辑。根据逻辑不同,产生具体的工厂产品。而此时的Test变为

    

    这里就体现了简单工厂模式的适用场景,应用层Test不需要关心如何创建对象,只传入工厂类的参数。这样正是简单工厂模式的优点。

    到这里这个案例好像就完成了,但是仔细想想简单工厂模式的缺点。

    当我们需要实现的视频种类越多时,我的工厂类新增逻辑判断越多,这就违背了开闭原则。对于基类不应该频繁修改。

    那么我们再来优化一下这个代码:

    工厂类:

    

    应用层

    

    这里我们利用的Java的反射机制,对于工厂类我们通过应用层传入的实现类的类对象JavaVideo.class。

    获取传入参数的类名并通过Class.forName方法加载这个类通过newInstance方法去获取对象。

    实现了不同的业务实现同时不需要在工厂类中去新增逻辑判断了。这样就解决了简单工厂模式的缺点。

    那么案例的Coding就到这里了,今天太晚了,关于jdk源码解析,那就明晚再写吧。

     = =今晚要出去吃饭,后天晚上写

  

设计模式-简单工厂Coding+jdk源码解析的更多相关文章

  1. 简单工厂(三)——JDK源码中的简单工厂

    private static Calendar createCalendar(TimeZone zone,Locale aLocale) { CalendarProvider provider = L ...

  2. 设计模式课程 设计模式精讲 8-11 单例模式源码解析(jdk+spring+mybaties)

    1 源码解析 1.1 单例解析1 1.2 单例解析2(容器单例) 1.3 单例解析3 1.4 单例解析4 1 源码解析 1.1 单例解析1 java.lang.Runtime /** * 饿汉式加载, ...

  3. Integer.parseInt不同jdk源码解析

    执行以下代码: System.out.println(Integer.parseInt("-123")); System.out.println(Integer.parseInt( ...

  4. JDK源码解析之Java SPI机制

    1. spi 是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件. 系统设计的各个抽象,往往 ...

  5. JDK源码解析---HashMap源码解析

    HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是 ...

  6. JDK源码解析(一)ArrayList源码解析

    这里为了方便写注释,我是把ArrayList的源码复制下来放到自己创建的类里面的 这个变量则指向具体存放数据的数组 看下构造函数吧 点进去看下LinkedList是怎么数组化的 很弱智吧,就是创建一个 ...

  7. 观察者模式JDK源码解析

    由于JDK中为了方便开发人员,已经写好了现成的观察者接口和被观察者类. 先来观察者接口: //观察者接口,每一个观察者都必须实现这个接口 public interface Observer { //这 ...

  8. java JDK源码解析

    Hashmap 使用java语言进行系统开发时,使用得比较多得数据结构hashmap,它以[key,value],进行数据存储,通过key可以快速找到到对应的value值,但是key,value不能是 ...

  9. JDK源码解析string之二

    (28) public boolean startsWith(String prefix, int toffset) { char ta[] = value; int to = toffset; ch ...

随机推荐

  1. Docker 加速器设置

    在部署完docker的时候我们需要进行在镜像源下载镜像的时候有时候会出现特别慢的情况(这是因为本地到源的网络出现了问题),这时候就需要使用加速器来对镜像进行下载了,在面咱们就聊一聊docker加速器的 ...

  2. ​《数据库系统概念》1-数据抽象、模型及SQL

    ​DBMS(database-management system)包括数据库和用于存取数据的程序,DBMS的基本目标是为数据的存取提供方便.高效的方式,此外对大多数企业来说,数据是非常重要的,所以DB ...

  3. Java并发编程(二)同步

    在多线程的应用中,两个或者两个以上的线程需要共享对同一个数据的存取.如果两个线程存取相同的对象,并且每一个线程都调用了修改该对象的方法,这种情况通常成为竞争条件.  竞争条件最容易理解的例子就是:比如 ...

  4. beta冲刺随笔集

    团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504 陈顺兴 031602505 张胜男 031602540 廖钰萍 031602323 雷光游 031602319 吴志鸿 03 ...

  5. html 知识整理

    一. 前言 本文全面介绍了html的定义.使用和具体常用标签. 参考资料:菜鸟教程 二.定义 html是HyperText Markup Language的简称,也就是超文本标记语言的缩写.通过htm ...

  6. centos7发行版号对应基于RHEL Source(版本)对照表

    基础分布 详情地址:https://wiki.centos.org/Download 存档版本 CentOS Linux 7 发布 基于RHEL Source(版本) 存档的树 7(1804) 7.5 ...

  7. SVN服务端VisualSVN数据转移说明

    两台服务器,进行SVN的迁移: 系统平台:windows server 2008 and windows server 2012 版本库:meishu 源服务器:192.168.0.245 目标服务器 ...

  8. php5.4之分布式缓存memcache(windows7下安装配置)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/36663203 使用理由:就是为了频繁查询 ...

  9. redis缓存设计

    1:缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...

  10. QT 14 线程使用

    1 线程基础 QThread 是对本地平台线程的一个非常好的跨平台抽象.启动一个线程非常简单.让我们看一段代码,它产生另一个线程,该线程打印hello,然后退出. // hellothread/hel ...