一个优秀的android开源框架中往往会体现出很多Java设计模式的影子,了解设计模式有助于理解开源框架中的程序设计之美接下来我会将自己整理的对一些设计模式的理解记录在这里
这个系列我会尽量将设计模式中比较容易混淆的概念统一起来进行分析和比较,
而一些比较简单的模式例如单例模式,会直接忽略
文章中设计一些个人的理解如有偏差,敬请指正
若您对我的分享感兴趣可以访问:java设计模式专栏
本篇记录:工厂模式、 抽象工厂模式、享元模式、建造者模式、原型模式
1、工厂模式
工厂模式的描述是:你只需要关心一个产品的结果而不需要关心这个产品是如何生产出来的,例如你可能需要一辆奔驰或者一辆宝马,你不需要知道工厂是如何生产出来的,你只需要得到一个结果,宝马或者奔驰就可以了
用来替代什么?
为什么需要?
可能你会有疑问既然是用来替代new,那么为什么不直接new出来呢?好像使用工厂模式代码量也增加了
问题在于如果是一个简单的new操作我们直接new没有什么疑问,但是如果在我们new一个对象的时候需要进行一些初始化操作,例如比如赋值,比如查询数据库等,此时如果我们应用里面多处需要此对象,就会产生多处的代码拷贝或者重复工作,不切也不利于将来的代码维护,使用工厂模式就可以完美解决这些问题
工厂模型的必备:具体的应用:调用支付接口需要使用工厂创建支付Bean,PayFactrory
例如:QQ的换皮肤
每一套不同风格的皮肤都是由一个低级工厂产出的,而这些低级工厂又是被超级工厂生产出来的简单的理解享元模式其实就是应用缓存的概念
介绍:
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能,享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象
如何解决:
用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。
关键代码:
用 HashMap 存储这些对象。
优点:大大减少对象的创建,降低系统的内存,使效率提高。
缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱
注意事项:
1、注意划分外部状态和内部状态,否则可能会引起线程安全问题
2、这些类必须有一个工厂对象加以控制
应用实例:
1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。 2、数据库的数据池。
可能看到上面有些人会疑惑什么是外部状态,什么是内部状态?
我们举一个例子:
如果我们需要开发一款围棋软件,我们可以发现围棋的棋子应该是可以用享元模式来进行缓存,但是对围棋棋子进行进一步分析发现虽然黑色棋子和白色棋子可以共享,但是它们将显示在棋盘的不同位置,如何让相同的黑子或者白子能够多次重复显示且位于一个棋盘的不同地方?
解决方法就是将棋子的位置定义为棋子的一个外部状态,在需要时再进行设置
我们可以把外部状态定义成一个位置类,用来描述棋子的位置因素
也就是说我们将除去位置因素之后的棋子变成一个共享的对象,可以使用缓存,当需要使用到位置因素的时候,使用不同的位置对象进行表征
4、建造者模式