在Java和C#的编程世界里,并没有出现像C++那样的多脉继承,它们只支持单一的继承,或者多级继承,这一变化最大的影响,我觉得是大大的降低了编程的难度,因为没有了C++的多级多脉继承,所以接口出现了,它支持多重继承,当然它的主要目的是为了实现解耦,将定义与实现分离。今天就来谈谈我对Java中面向接口编程的看法,以及个人的一些改进。

先看下面一段简短的代码,

public static void main(String[] args){loginDao dao = new loginDaoImpl();String result = dao.loginInvalidate("root", "123");System.out.println("result:" + result);}

重点是包含new的那一行,这是我刚做项目时的写法,定义一个接口,一个该接口的实现类,测试的时候,通过多态实例化接口即可。但是如此,我们不得不想,面向接口的初衷是为了将定义与实现进行分离,从而达到解耦的目的。但是如果像上面的那种方式使用,那么对于一个大型的项目,那得修改多少这样的类,工作量大的吓人,所以,我们需要重新思考面向接口的使用。针对这种情况,决定采用简单工厂模式,配合单例模式,对面向接口编程进行深度解耦。

下面我们再看一段简短的代码:

public static void main(String[] args){loginDao dao = DataFactory.createLoginDao();String result = dao.loginInvalidate("root", "123");System.out.println("result:" + result);}

这段代码和上一段代码有一个明显的差别,就是使用了DataFactory这个自定义的工厂类,下面我们来详细研究这个工厂类:DataFactory

package com.azer.shop.factory;import com.azer.shop.constant.Constants;
import com.azer.shop.dao.loginDao;
import com.azer.shop.utils.LoadProperty;public class DataFactory
{/*** 实例化登录验证接口* * @return*/public static loginDao createLoginDao(){try{return (loginDao) Class.forName(LoadProperty.getClassName(Constants.LOGINDAOIMPL)).newInstance();} catch (Exception e){e.printStackTrace();return null;} }
}

其实这段代码也很简单,就是实例化一个接口,不过并没有使用new,取而代之的是newInstance。两者的区别主要体现在newInstance是一种弱类型。低效率的方式,只能调用无参构造。而new是一种强类型。相对高效的创建对象的方式,能调用任何public构造函数。  在这个方法里,我们使用反射来实例化一个对象,在Class.forName()方法的参数中只需要提供完整的类名(包名+类名),就可以实例化该类。为了进一步解耦,我们将该完整的类名写入到一个属性文件中,取出的时候根据键来获取完整的类名。进一步的改进,我们将键名写入到一个常量文件中,当以后需要修改的时候,只需要修改该常量即可,非常方便。Constants.LOGINDAOIMPL代表属性配置文件中键的名称,LoadProperty.getClassName()的目的是为了获取接口实现类的完整类名名称。

package com.azer.shop.utils;import java.io.InputStream;
import java.util.Properties;import com.azer.shop.constant.Constants;@SuppressWarnings("serial")
public class LoadProperty extends Properties
{private static LoadProperty instance;public static LoadProperty getInstance(){if (instance != null){return instance;}else{makeInstance();return instance;}}private static synchronized void makeInstance(){if (instance == null){instance = new LoadProperty();}}private LoadProperty(){InputStream inputStream = getClass().getResourceAsStream(Constants.FILE_NAME);try{load(inputStream);} catch (Exception e){System.out.println("配置文件出错!!");e.printStackTrace();}}public static String getClassName(String classNameKey){return LoadProperty.getInstance().getProperty(classNameKey);}
}

下面是完整的源码,提供给读者进行学习、交流。

Java使用简单工厂模式对面向接口编程模式的深度解耦实现相关推荐

  1. 设计模式的征途—2.简单工厂(Simple Factory)模式

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的"小弟",我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式, ...

  2. 简单工厂(Simple Factory)模式

    简单工厂(Simple Factory)模式 Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个公共的父类和公共的方法. Simple Fact ...

  3. 简单工厂(Simple Pattern)模式

    一.简单工厂(Simple Factory)模式 Simple Factory 模式根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个公共的父类和公共的方法. Simple F ...

  4. 轻松看懂java设计模式简单工厂模式

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...

  5. Java设计模式 -- 简单工厂模式(SimpleFactory)

    一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...

  6. java的简单工厂模式_java设计模式之简单工厂模式

    简单工厂模式的概念 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. ...

  7. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  8. java设计模式--简单工厂模式

    1.概念:建立一个工厂(一个函数或一个类方法)来制造新的对象,简单工厂模式静态工厂方法模式,存在的目的很简单:定义一个用于创建对象的接口. (注意点:简单工厂模式的方法是静态的) 2.组成: 1) 工 ...

  9. 设计模式(java)—— 简单工厂模式之农场,女娲造人

    1.一个农场专门负责种植各种水果,比如苹果.草莓.葡萄等,任何水果都可以种植.生长和采摘.此外,每一种水果还有自己的特性,如:苹果是多年生具有树龄的属性,葡萄则分为有籽或无籽等.农场生产的水果都送入超 ...

最新文章

  1. 模型大十倍,性能提升几倍?谷歌研究员进行了一番研究
  2. Microbiome: 绝对定量环境样本细菌、真菌、真核群落丰度
  3. 操作系统知识——互斥和死锁
  4. TCP与UDP特点与区别
  5. java 蓝桥杯 基础练习 FJ的字符串
  6. 风控必须了解的报表权限与角色控制
  7. STM32F103xxx大容量增强型芯片之间有什么区别?(来自STM32神舟系列)
  8. java中do until_RxJava—takeUntil实践
  9. jmeter压测学习15-setUp线程组实现用户先登录
  10. 如何远程连接计算机网络打印机,远程打印机共享怎么设置
  11. Springboot(大总结)
  12. java垃圾收集方法_Java垃圾收集算法简介
  13. 哪个品牌台灯护眼效果好?分享被央视315表扬的护眼灯
  14. 使用 acme.sh 生成免费的泛域名证书
  15. 手把手教你ARC——iOS/Mac开发ARC入…
  16. Cannot access 'age' before initialization错误
  17. Base64转码和字符串互转
  18. 8月30日科技联播:子弹短信总激活用户超过400万,亚马逊将成第2个万亿美元市值企业...
  19. 电脑安装win8.1后 前面板没有声音的解决办法
  20. c++多线程调用python脚本

热门文章

  1. 【数字信号处理】基本序列 ( 实指数序列 | 收敛序列 | 发散序列 )
  2. 【Groovy】Groovy 脚本调用 ( Groovy 脚本编译 | Groovy 脚本字节码文件分析 )
  3. 【Flutter】StatefulWidget 组件 ( PageView 组件 )
  4. 【鸿蒙 HarmonyOS】创建 Java 语言 HarmonyOS 手机应用 ( 首次进入 DevEco Studio 配置环境 | 创建 Java 手机工程 | 鸿蒙工程代码目录简介 )
  5. 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
  6. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
  7. 服务 TCP 断线错误分析
  8. php 二维数组排序详解: array_multisort
  9. 思科交换机和路由器的远程配置
  10. C++primer 10.6节练习