设计模式
2019-04-10 18:55:55 35 举报
AI智能生成
设计模式
作者其他创作
大纲/内容
简单工厂
1. 就一个实现工厂类,所有的对象交由该工厂类创建
2. 外部通过这个工厂类获取对象
优缺点
优点
就一个具体的工厂来创建对象,代码量少
缺点
工厂中新增元素,就需要修改工厂代码,违反开闭原则
源码案例
1. Calendar中根据参数获取不同的Calendar类
2. Mysql加载驱动,根据驱动类名获取Mysql连接Connection
工厂方法
1.定义一个创建对象的工厂接口
2.多个实现工厂类
使用场景
常见对象需要大量重复的代码
应用层不依赖产品类实例如何被创建、实现等细节
一个类通过其子类来制定创建哪个对象
优缺点
优点
易使用,用户只关心所需产品的对应工厂,无需关注创建细节
易扩展,加入新产品时只需实现工厂接口的新子类,遵守开闭原则
缺点
类的个数过多,增加复杂度
增加了系统的抽象性和理解难度
源码案例
Collection#iterator()工厂接口的工厂方法,ArrayList#iterator() 工厂方法,返回产品ArrayList.Itr
URLStreamHandlerFactory 工厂接口,sun.misc.Launcher.Factory实现工厂,返回产品URLStreamHandler
org.slf4j.LoggerFactory#getLogger(java.lang.String) 工厂接口的工厂方法
建造者模式
定义
将一个复杂对象的构建于它的表示分离,注重创建过程
优缺点
优点
1. 封装性好,创建和使用分离
2. 扩展性好,建造类之间独立,一定程度上解耦
缺点
会产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大
工厂模式
工厂模式就是让创建对象变得简单而且修改对象时能很方便
另一个方便就是体现在解耦
七大原则
开闭原则
定义
一个软件实体,如类、模块和函数,应该对扩展开放,对修改关闭;也就是说,软件应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化
优点
提高软件系统的可复用性及可维护性
依赖倒置原则
高层模块不应该依赖底层模块,二者都应该依赖其抽象
针对接口编程,不要针对实现编程,尽量每个类继承抽象类或实现接口
优点
可以减少类间的耦合性、提高系统稳定性,提高代码可读性和可维护性,降低修改程序所造成的风险
里氏替换原则
单一职责原则
接口隔离原则
迪米特原则
里氏替换原则
合成复用原则
单例模式
定义
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
编写单例模式三步骤
1.构造函数私有化
2.在类的内部创建实例(对象)
3.提供获取实例的方法
实现方案
饿汉式
类加载时创建,浪费内存,但写法简单,不存在线程安全问题
懒汉式
第一次使用时才创建实例,延迟加载,存在线程安全问题
直接对获取实例的方法加锁,可以保证线程安全,但是并发获取实例性能差
双重锁
懒汉式的线程安全版本,利用双重锁使延迟加载的同时保证了线程安全
避免了无用的加锁解锁开销,性能更好
重点注意volatile防止new时重排序
静态内部类
利用类初始化线程安全和静态内部类的延迟加载原理实现单例模式
枚举
写法简单,线程安全,并发性能好,序列化安全,反射安全;缺点是不能延迟加载
重点
构造器私有
延迟加载
降低内存开销
线程安全
使用双重检测保证线程安全,同时提高并发性能
类加载时就创建实例的都是线程安全的
序列化安全
反序列化底层是使用反射获取对象,readResolve()方法可以防止反序列化获取新对象
反射安全
延迟加载的都是反射不安全的
饿汉式在构造函数中判断实例为null时,抛出异常
优缺点
优点
内存里只有一个实例,减少了内存开销
可以避免对资源的多重占用
设置全局访问点,严格控制访问
缺点
没有接口,扩展困难,需要修改已有的代码
源码案例
Runtime饿汉式单例模式
享元模式
定义
运用共享技术有效地支持大量细粒度对象的复用,与缓存类似
适用场景
系统底层开发,以便解决系统的性能问题
系统有大量相似对象,需要缓存池的场景
优缺点
优点
减少对象创建,降低内存中对象数量,减少内存占用
减少内存之外的其他资源占用,如文件句柄等有限资源需要复用
缺点
线程安全问题
关注内、外部状态
系统、程序逻辑复杂化
源码案例
IntegerCache中缓存了-128~127
相关设计模式
代理模式
单例模式
自由主题
0 条评论
下一页