java设计模式分析之开篇

一个优秀的android开源框架中往往会体现出很多Java设计模式的影子,了解设计模式有助于理解开源框架中的程序设计之美接下来我会将自己整理的对一些设计模式的理解记录在这里

这个系列我会尽量将设计模式中比较容易混淆的概念统一起来进行分析和比较,

而一些比较简单的模式例如单例模式,会直接忽略

文章中设计一些个人的理解如有偏差,敬请指正

若您对我的分享感兴趣可以访问:java设计模式专栏

本篇记录:工厂模式、  抽象工厂模式、享元模式、建造者模式、原型模式

1、工厂模式

工厂模式的描述是:你只需要关心一个产品的结果而不需要关心这个产品是如何生产出来的,例如你可能需要一辆奔驰或者一辆宝马,你不需要知道工厂是如何生产出来的,你只需要得到一个结果,宝马或者奔驰就可以了
用来替代什么?

工厂模式用来替代创建实例对象的new

为什么需要?
可能你会有疑问既然是用来替代new,那么为什么不直接new出来呢?好像使用工厂模式代码量也增加了

问题在于如果是一个简单的new操作我们直接new没有什么疑问,但是如果在我们new一个对象的时候需要进行一些初始化操作,例如比如赋值,比如查询数据库等,此时如果我们应用里面多处需要此对象,就会产生多处的代码拷贝或者重复工作,不切也不利于将来的代码维护,使用工厂模式就可以完美解决这些问题

工厂模型的必备:
(1)父类,即工厂所有产品的父类
(2)使用工厂类根据条件负责生产所有产品
使用反射和泛型可以不用每增加一个对象都需要实现在工厂里面增加一条产品线,但是这样只能实现简单的new 而不能呢个实现复杂的生产对象的功能
应用场景:
例如:我们请求支付的时候可能需要有几种支付模式:微信,支付宝,零钱,可以使用工厂类来生产这几个数据bean

具体的应用:调用支付接口需要使用工厂创建支付Bean,PayFactrory


2、抽象工厂模式
抽象工厂模式是一种类似于超级工厂的实现
这种超级工厂可以用来生产其他的低级工厂,这些低级工厂用来生产相同系列的商品
因此使用超级工厂模式可以用来直接生产出一系列的产品

例如:QQ的换皮肤

每一套不同风格的皮肤都是由一个低级工厂产出的,而这些低级工厂又是被超级工厂生产出来的
于是我们可以直接使用超级工厂来生产皮肤工厂,然后使用皮肤工厂来生产整套皮肤

3、享元模式

简单的理解享元模式其实就是应用缓存的概念

介绍:

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能,享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象

如何解决:

用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。

关键代码:

用 HashMap 存储这些对象。

优点:大大减少对象的创建,降低系统的内存,使效率提高。

缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱

注意事项:

 1、注意划分外部状态和内部状态,否则可能会引起线程安全问题

 2、这些类必须有一个工厂对象加以控制

应用实例:

 1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。 2、数据库的数据池。

可能看到上面有些人会疑惑什么是外部状态,什么是内部状态?

我们举一个例子:

    如果我们需要开发一款围棋软件,我们可以发现围棋的棋子应该是可以用享元模式来进行缓存,但是对围棋棋子进行进一步分析发现虽然黑色棋子和白色棋子可以共享,但是它们将显示在棋盘的不同位置,如何让相同的黑子或者白子能够多次重复显示且位于一个棋盘的不同地方?

解决方法就是将棋子的位置定义为棋子的一个外部状态,在需要时再进行设置

我们可以把外部状态定义成一个位置类,用来描述棋子的位置因素

也就是说我们将除去位置因素之后的棋子变成一个共享的对象,可以使用缓存,当需要使用到位置因素的时候,使用不同的位置对象进行表征

4、建造者模式
建造者模式可以用来生产更复杂的产品,但是整个构建过程是相似的,因此我们可以使用相同的构建过程来创建不同的表示,例如下图:我们构建一个快餐套装的过程
建造者模式和工厂模式的区别是:建造者模式更加关注于零件装配的顺序

java设计模式分析之开篇_第1张图片

5、原型模式
这种模式是用于当创建一个新的对象需要付出较大的代价的时候,使用原型模式可以根据原有对象克隆出一个新的对象
通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。
原型模式使用起来比较简单,就是根据java提供的clone方法,来对原有对象进行复制,主要需要考虑的点有:如何进行深层次的克隆,在什么场景下需要进行克隆

你可能感兴趣的:(android知识点,JAVA,java设计模式)