《拉勾Java高薪课程》阶段一输出 之 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)--菜鸟小回
通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)
文章目录
- 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)
- @[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高薪课程》阶段一输出 之 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)--菜鸟小回相关推荐
- 11.1 常用的包(熟悉) | 拉勾Java就业急训营
学习资源来源:拉勾教育_Java就业急训营 11.1 常用的包(熟悉) 11.1.1 包的名称和功能 java.lang包--该包是Java语言的核心包,并且该包中的所有内容由Java虚拟机自动导入. ...
- Java设计模式(1)工厂模式(Factory模式)
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
- JAVA设计模式之3种工厂模式
转自 JAVA设计模式之3种工厂模式 创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离.为了使软件的结构更加清晰,外 ...
- Java设计模式之策略模式+工厂模式+模板模式
Java设计模式之策略模式+工厂模式+模板模式 1.策略模式+工厂模式+模板模式 个人的理解:实际开发工程中,一些业务很复杂的逻辑使用很多的 if 或者 if···else 语句,不利于维护和扩展,为 ...
- 【一】Java 设计模式学习记录: 工厂模式
文章目录 一.设计模式的分类 二.工厂模式 2.1 简单工厂模式 2.1.1 解决的问题 2.1.2 简单工厂模式是什么 2.1.3 优缺点 2.2 工厂方法模式 2.2.1 解决的问题 2.2.2工 ...
- 《Java设计模式与实践》——工厂模式
一直觉得设计模式这个东西只能浮于表面落不了地,毕竟java后端在一般情况下是很少会用到,因为大部分业务逻辑只是很简单的增删改查.最近几天想再回头看看设计模式,突然想到,如果将设计模式的理论与我们平时能 ...
- 我以订披萨为例,给朋友详细讲了Java设计模式的3种工厂模式
摘要:工厂模式是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性. 本文分享自华为云社区<[Java设计模式]用 披萨订购案例 详 ...
- 手撕设计模式之「简单工厂模式」(Java描述)
前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...
- Java的设计模式 之 简单的工厂模式(一)
工厂模式使用到java的多态,接口知识点 本文仅仅帮助自己记住知识点. //使用的接口类interface Moveable{public void run();}//实现Moveable接口的类cl ...
最新文章
- XCode 项目配置说明
- 关于VC网络编程中用 char 发送结构体的说明
- 面试官问:Mybatis和Mybatis-Plus执行插入语句后可以返回主键ID吗? 我:看我回答...
- 腾讯初探AI+农业 获国际AI温室种植大赛亚军
- Deploying Keras model on Tensorflow Serving
- 高速的二舍八入三七作五_有没有发现,高速收费都是5的倍数,这是为什么?怎么判断的?...
- python编程教程交互式联系_Python Koans交互式教程
- 13. OD-内嵌补丁,过期的软件DVD Menu Studio破解,switch函数,break等于KillTimer
- JBoss-4.2.3.GA下发布EJB3项目遇到的问题之JSF篇
- linux配置路径PATH问题
- python kivy kv模板调用_正确使用.kv文件进行Kivy并将其导入到Python...
- SpringMVC使用json格式之间的转换的工具类
- 信号与系统(十七)—— 傅里叶变换及性质(1)常用函数的傅里叶变换
- 朱兰的质量观(转载)
- 鼠标连点器(VB.net 全局键盘钩子+模拟鼠标 左键、右键)
- IEEE1588精密网络同步时钟协议(PTP)-v2.0协议浅析
- Windows Rootkit 技术分析
- 把edge默认上网页面改为百度
- 刚工作2年时15k运维工程师-简历
- docker mysql 启动命令_Mac 下使用 Docker mysql 运行的容器如果挂载了/var/lib/mysql 不能启动容器...
热门文章
- 大麻病毒详细介绍与汇编分析
- 微信二次开发需要多少钱,不得不说的内幕!
- html input 提示文字
- php 公众号微信支付流程,微信公众号支付完整流程案例
- 织梦采集无需授权自动织梦采集插件
- 网易云音乐下载软件(下)
- 【ERROR】cannot verify xxx certificate, issued by ‘/C=US/O=Let’s Encrypt/CN=R3’:use `--no-check-certif
- 如何使用MinIO 建立阿里云OSS代理
- 基于JSPatch的iOS应用线上Bug的即时修复方案,附源码.
- Apache/Tomcat/JBOSS/Nginx区别