学习主题:设计模式
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
1. 单例模式_应用场景_饿汉式_懒汉式(视频1-3)
(1) 什么是单例模式?为什么需要单例模式?
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决
单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理
(2) 饿汉式与懒汉式的区别是什么?
饿汉式在类加载的时候就已经实例了唯一对象(线程安全),用户的每次访问都是返回此对象,效率高(不能延迟加载)
静态内部式最好 (即可以延迟加载,效率又高)
枚举式(不用担心反编译和反射恶意获取新实例)
双重检测锁(JVM底层内部模型原因,有时候会出问题)
懒汉式在用户调用时才实例化对象 ,用户不安全需要加线程锁,效率低(延迟加载)
2. 简单工厂模式_面向对象设计原则_开闭原则_依赖反转原则_迪米特法则(视频4-6)
(1) 说一说简单工厂模式
用工厂方法代替new 操作(就是说对象由工厂new ,调用者只负责使用,这就实现了调用者和实现类的解耦)
就是工厂类一般是使用静态方法通过接受的参数的不同返回不同的对象实例(增加新产品的话就需要修改源码,这就违反了OCP原则开闭原则,就是不推荐使用修改源码的方式实现新功能,而是写一个新的工厂来实现新的功能)
(2) 什么是开闭原则?
就是不推荐使用修改源码的方式实现新功能,而是写一个新的工厂来实现新的功能
OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开
放,对修改关闭。
(2)什么是依赖反转原则?
DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,
不要针对实现编程。
(3) 什么是迪米特法则?
LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和
陌生人通信。
3. 建造者模式详解_类图关系
(1) 什么是建造者模式?类与类之间有什么关系?
本质就是对一个复杂的组件分离给了两个对象实现, 组件的零件由(Builder来负责),零件的装配由Director负责,从而构造出复杂的对象
一般适用于复杂对象的构建
由于实现了构建和装配的解耦,不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器不同的装配模板也可以做出不同的对象.也就是实现了构建算法,装配算法的解耦,实现了更好的复用
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。
第206次(设计模式)
学习主题:设计模式
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
4. 原型模式_prototype_浅复制_深复制_Clonable接口
(1) 什么是原型模式?
本质就是通过克隆对象来节省时间
通过new产生一个对象需要飞非常繁琐的数据准备或访问权限,则可以使用原型模式
通过java中的克隆技术,以某个对象为原型,复制出新的对象 ,显然,新的对象具备原型对象的特点
优势:效率高(直接克隆,避免了重新指向构造过程步骤)
克隆类似于new,但不同于new,new创建新的对象属性采用的是默认值,克隆出的对象的属性值完全和原型对象相同,并且克隆出的新对象不会改变原型对象.然后,再修改克隆对象的值
原型模式实现: – Cloneable接口和clone方法 – Prototype模式中实现起来最困难的地方就是内存复制操作,所幸在Java中提供了 clone()方法替我们做了绝大部分事情。
(2) 什么是浅复制?什么是深复制?
浅复制存在的问题
被复制的对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原理的对象
深复制的实现(就是将引用的对象也复制一般,指向新复制的对象,也可以使用序列化和反序列化技术实现深克隆)
深复制把引用的变量指向复制过的新对象,而不是原有的被引用的对象
深复制:让已实现Clonable接口中的类中的属性也实现Clonable接口
基本数据类型和string能够自动实现深度克隆(值的复制)
1.通过序列化和反序列化// User user2=(User) user.clone();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(user);
byte[] bytes = bos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
User user2=(User) ois.readObject();//克隆好的对象
2.通过正常的克隆
//复制对象
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj= super.clone();//直接调用父类的克隆方法
/** //添加如下内容实现深复制
User user = (User) obj;
user.birthday = (Date) this.birthday.clone();//将date属性也克隆一份
*/ return obj;
}
(3) Clonable接口是做什么用的
克隆需要实现的接口
5. 适配器模式_对象适配器_类适配器_开发中场景
(1) 什么是适配器模式?什么时候用适配器模式?
将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本接口不兼容而不能一起工作的那些类可以在一起工作
当你需要使用一个接口与你不兼容的类时可以使用适配器模式
6. 代理模式
(1) 什么是代理模式?为什么需要代理模式?代理模式有什么好处
通过代理让真实角色只做它该做的事,一些平常事可以交给代理去做,真正需要真实角色做的事就让代理通知
7. 桥接模式_多层继承结构_银行日志管理_银行系统消息管理_人力资源的奖金计算
(1) 什么是桥接模式?为什么需要桥接模式?什么业务场景下使用桥接模式
桥接模式核心:
处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联
为什么需要桥架模式, 减少类与类之间的耦合,更好的可扩展性,
8. 组合模式_树状结构_杀毒软件架构_JUnite底层架构_常见开发场景
(1) 什么是组合模式? 什么时候使用组合模式?
把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。