通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)


文章目录

  • 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)
    • @[toc]
    • 一、单例模式
      • 1. 相关概念
      • 2. 演示思路
      • 3. 代码实现
      • 4. 结果演示
    • 二、代理模式
      • 1. 相关概念
      • 2. 演示思路
      • 3. 代码实现
      • 4. 结果演示
    • 三、工厂模式
      • 1. 相关概念
      • 2. 演示思路
      • 3. 代码实现
      • 4. 结果演示
    • 四、融合三种设计模式(选读)
      • 1. 演示思路
      • 2. 代码实现
      • 4. 结果演示

源码:design-pattern


前言:由于一段时间的外包生活,觉得自己技术开始落后,很多基础知识和底层已经遗忘殆尽。对所有的框架都所谓“知其然而不知所以然”,焦虑袭上心头的时候发现了拉勾高薪课程。目前学习完mybatis源码实现和spring手写ioc和aop,感受颇多。此文结合讲师的设计模式解析。自己总结并结合身边实例,输出自己学习内容。

相关拉勾课程输出笔记:模块一:持久层框架设计实现及MyBatis源码分析-学习笔记
专栏地址:拉勾专栏(持续更新…)


一、单例模式

1. 相关概念

  • 单例模式:应用在全局只有一个实例对象时,将自身实例化并赋值给一个属性,加载到此类时直接调用其静态实例。分为懒汉和饿汉式,此处展示饿汉式
  • 实现思路:此类为静态,只暴露getInstance方法,jvm启动过程只加载一次
  • 主要用途:整个项目只要一种配置,基本固定的值,仅实例化一次;如数据库的连接信息

2. 演示思路

  • 假设某地区房产中介只有一个Tom,完全垄断租房中介产业。张三Z和李四L都想在北京租房,只能找Tom。Tom不需要打太多广告,只需要把自己的名字和代理费用打印成一张名片。

3. 代码实现

  • 中介Tom(忽略get,set,toString)
public class Agent {//无参构造private Agent(){};//实例化private static Agent agent=new Agent();//提供实例化后的对象以便使用(Tom印制自己的名片,准备发放)public static Agent getInstance(){System.out.println("单例模式,只有我一个代理!代理权被我Tom垄断了....");return agent;}private String name;private Integer fee;static {agent.setName("tom");agent.setFee(500);}
}
  • 租户张三:
public class Tenant_Z {public static void main(String[] args) {System.out.println("张三想要租房....");//(找到中介公司,只有一个中介)Agent agent=Agent.getInstance();System.out.println(agent);}
}
  • 租户李四:
public class Tenant_L {public static void main(String[] args) {System.out.println("李四想要租房....");//(找到中介公司,只有一个中介)Agent agent=Agent.getInstance();System.out.println(agent);}
}

4. 结果演示


二、代理模式

1. 相关概念

  • 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式 的英文叫做Proxy,它是一种对象结构型模式,代理模式分为静态代理和动态代理,此处演示JDK动态代理
  • 实现思路:使用JDK自带的动态代理
  • 主要用途:在多个业务逻辑的前后有固定的非业务方法,做出提取,代理该方法并实现加强。比如JDBC操作中,每次连接数据库进行操作都需要创建连接,最后释放连接,与实际的业务掺杂在一起。

2. 演示思路

仍然是租赁房屋,但风水轮流转,这次张三Z和李四L是代理,租房给Tom,不但是租赁前收取你的代理费用,还在你租赁完成后售出你的个人信息。赚两份钱,并且他还不想让你知道。只要你找他租赁,就默默的在成功给你租到房后售出信息。

3. 代码实现

  • 租赁行为(也就是待加强的方法,JDK动态代理代理对象必须是接口实现类)
// 租赁接口
public interface IRenting {void rent(String name);
}
//接口实现
public class RentingImpl implements IRenting {public void rent(String name) {System.out.println(name+"作为代理租赁了出一套房子");}
}
  • JDK动态代理加强方法
public class JDKProxy {public static Object getJDKProxy(Object o){return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result;System.out.println("先收取代理费用500元");result = method.invoke(o, args);System.out.println("最后卖出客户信息5元");return result;}});}
}
  • Tom找张三租赁
public class Agent_Z {public static void main(String[] args) {System.out.println("Tom想要租房....再找张三代理...");IRenting renting=(IRenting)JDKProxy.getJDKProxy(new RentingImpl());renting.rent("张三");}
}
  • Tom找李四租赁
public class Agent_L {public static void main(String[] args) {System.out.println("Tom想要租房....先找李四代理...");IRenting renting=(IRenting)JDKProxy.getJDKProxy(new RentingImpl());renting.rent("李四");}
}

4. 结果演示

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hmI3NUpc-1627868414312)(http://img.huijia21.com/blog/1627830083514.png)]

三、工厂模式

1. 相关概念

在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

2. 演示思路

张三Z和李四L通过双份收入获得了第一桶金,也开启了各自的代理分公司。他们业务还是按照原来的总公司的租赁业务,但各自在租赁时开始打上自己的服务口号…

3. 代码实现

  • 租赁行为的总工厂以及具体实现的分工厂
//总工厂
public interface IRentingFactory {void rent();
}
//张三实现工厂
public class RentingFactory_Z implements IRentingFactory {public void rent() {System.out.println("张三租赁公司分公司为您服务...");}
}
//李四实现工厂
public class RentingFactory_L implements IRentingFactory {@Overridepublic void rent() {System.out.println("李四租赁公司分公司为您服务...");}
}
  • Tom找张三分公司代理
public class Tenant_Tom_To_Z {public static void main(String[] args) {System.out.println("Tom想要租房....找张三分公司代理...");IRentingFactory renting=new RentingFactory_Z();renting.rent();}
}
  • Tom找李四分公司代理
public class Tenant_Tom_To_L {public static void main(String[] args) {System.out.println("Tom想要租房....找李四分公司代理...");IRentingFactory renting=new RentingFactory_L();renting.rent();}
}

4. 结果演示

四、融合三种设计模式(选读)

1. 演示思路

张三Z和李四L两人的公司越开越大,分别占领了该地区的南北两大地区。从此单人垄断变成双人联合垄断,各自打印各自名片,只对自己所属地区进行发放。与此同时,上级公司任然挂名,他们也仍像以前一样收取代理费后,售卖个人信息。

2. 代码实现

  • 租赁行为的总工厂以及具体实现的分工厂
//总工厂
public interface IRentingFactory {void rent();
}
//张三实现工厂
public class RentingFactory_Z implements IRentingFactory {public void rent() {System.out.println("张三租赁公司分公司为您服务...");}
}
//李四实现工厂
public class RentingFactory_L implements IRentingFactory {@Overridepublic void rent() {System.out.println("李四租赁公司分公司为您服务...");}
}
  • 张三的名片
public class Agent_Z {//无参构造private Agent_Z(){};//实例化private static Agent_Z agent=new Agent_Z();//提供已经实例化的对象方便调用(张三印制自己的名片,准备发放)public static Agent_Z getInstance(){System.out.println("单例模式,本地区只有我张三一个代理!");return agent;}private String name;private Integer fee;static {agent.setName("张三");agent.setFee(500);}
}
  • 李四的名片
public class Agent_L {//无参构造private Agent_L(){};//实例化private static Agent_L agent=new Agent_L();//提供已经实例化的对象方便调用(李四印制自己的名片,准备发放)public static Agent_L getInstance(){System.out.println("单例模式,本地区只有我李四一个代理!");return agent;}private String name;private Integer fee;static {agent.setName("李四");agent.setFee(500);}
}
  • JDK动态代理加强方法
public class JDKProxy {public static Object getJDKProxy(Object o){return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result;System.out.println("先收取代理费用500元");result = method.invoke(o, args);System.out.println("最后卖出客户信息5元");return result;}});}
}
  • Tom分别找两个代理公司租房
public class Tenant_Tom {public static void main(String[] args) {System.out.println("Tom在南方地区想要租房...");Agent_Z agent_z = Agent_Z.getInstance();System.out.println("获取名片:"+agent_z);IRentingFactory rentingFactory_Z=(IRentingFactory)JDKProxy.getJDKProxy(new RentingFactory_Z());rentingFactory_Z.rent();System.out.println("---------------------");System.out.println("Tom在北方地区想要租房...");Agent_L agent_l = Agent_L.getInstance();System.out.println("获取名片:"+agent_l);IRentingFactory rentingFactory_L=(IRentingFactory)JDKProxy.getJDKProxy(new RentingFactory_L());rentingFactory_L.rent();}
}

4. 结果演示

《拉勾Java高薪课程》阶段一输出 之 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)--菜鸟小回相关推荐

  1. 11.1 常用的包(熟悉) | 拉勾Java就业急训营

    学习资源来源:拉勾教育_Java就业急训营 11.1 常用的包(熟悉) 11.1.1 包的名称和功能 java.lang包--该包是Java语言的核心包,并且该包中的所有内容由Java虚拟机自动导入. ...

  2. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  3. JAVA设计模式之3种工厂模式

    转自 JAVA设计模式之3种工厂模式 创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离.为了使软件的结构更加清晰,外 ...

  4. Java设计模式之策略模式+工厂模式+模板模式

    Java设计模式之策略模式+工厂模式+模板模式 1.策略模式+工厂模式+模板模式 个人的理解:实际开发工程中,一些业务很复杂的逻辑使用很多的 if 或者 if···else 语句,不利于维护和扩展,为 ...

  5. 【一】Java 设计模式学习记录: 工厂模式

    文章目录 一.设计模式的分类 二.工厂模式 2.1 简单工厂模式 2.1.1 解决的问题 2.1.2 简单工厂模式是什么 2.1.3 优缺点 2.2 工厂方法模式 2.2.1 解决的问题 2.2.2工 ...

  6. 《Java设计模式与实践》——工厂模式

    一直觉得设计模式这个东西只能浮于表面落不了地,毕竟java后端在一般情况下是很少会用到,因为大部分业务逻辑只是很简单的增删改查.最近几天想再回头看看设计模式,突然想到,如果将设计模式的理论与我们平时能 ...

  7. 我以订披萨为例,给朋友详细讲了Java设计模式的3种工厂模式

    摘要:工厂模式是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性. 本文分享自华为云社区<[Java设计模式]用 披萨订购案例 详 ...

  8. 手撕设计模式之「简单工厂模式」(Java描述)

    前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...

  9. Java的设计模式 之 简单的工厂模式(一)

    工厂模式使用到java的多态,接口知识点 本文仅仅帮助自己记住知识点. //使用的接口类interface Moveable{public void run();}//实现Moveable接口的类cl ...

最新文章

  1. XCode 项目配置说明
  2. 关于VC网络编程中用 char 发送结构体的说明
  3. ‍面试官问:Mybatis和Mybatis-Plus执行插入语句后可以返回主键ID吗? ‍我:看我回答...
  4. 腾讯初探AI+农业 获国际AI温室种植大赛亚军
  5. Deploying Keras model on Tensorflow Serving
  6. 高速的二舍八入三七作五_有没有发现,高速收费都是5的倍数,这是为什么?怎么判断的?...
  7. python编程教程交互式联系_Python Koans交互式教程
  8. 13. OD-内嵌补丁,过期的软件DVD Menu Studio破解,switch函数,break等于KillTimer
  9. JBoss-4.2.3.GA下发布EJB3项目遇到的问题之JSF篇
  10. linux配置路径PATH问题
  11. python kivy kv模板调用_正确使用.kv文件进行Kivy并将其导入到Python...
  12. SpringMVC使用json格式之间的转换的工具类
  13. 信号与系统(十七)—— 傅里叶变换及性质(1)常用函数的傅里叶变换
  14. 朱兰的质量观(转载)
  15. 鼠标连点器(VB.net 全局键盘钩子+模拟鼠标 左键、右键)
  16. IEEE1588精密网络同步时钟协议(PTP)-v2.0协议浅析
  17. Windows Rootkit 技术分析
  18. 把edge默认上网页面改为百度
  19. 刚工作2年时15k运维工程师-简历
  20. docker mysql 启动命令_Mac 下使用 Docker mysql 运行的容器如果挂载了/var/lib/mysql 不能启动容器...

热门文章

  1. 大麻病毒详细介绍与汇编分析
  2. 微信二次开发需要多少钱,不得不说的内幕!
  3. html input 提示文字
  4. php 公众号微信支付流程,微信公众号支付完整流程案例
  5. 织梦采集无需授权自动织梦采集插件
  6. 网易云音乐下载软件(下)
  7. 【ERROR】cannot verify xxx certificate, issued by ‘/C=US/O=Let’s Encrypt/CN=R3’:use `--no-check-certif
  8. 如何使用MinIO 建立阿里云OSS代理
  9. 基于JSPatch的iOS应用线上Bug的即时修复方案,附源码.
  10. Apache/Tomcat/JBOSS/Nginx区别