1. 工厂模式
有些情况下对象的构建并不是简单的调用构造函数,还需要一些逻辑,这种情况下就适用工厂模式。工厂模式解决的问题就是通过封装让调用者不需要关心具体的构造过程,实现调用者与对象构造方法之间的解耦合。用比喻理解工厂模式,在工厂出现之前,做一件衣服需要自己买布、裁剪、缝制;但服装厂出现之后,上述步骤便交给工厂去做。
另外,工厂模式还可以将大量有共同接口的类实例化,工厂模式可以动态决定将哪一个类实例化。例如BeanFactory就是工厂模式;工厂模式通常会有一个类以xxFactory命名。
slf4j的例子:LoggerFactory.getLogger(Abc.class)

2. 单例模式
单例模式解决的问题是传统应用中,每当需要使用对象,则需要构造一个对象,且对象作用域仅限于方法执行期间,因此给GC造成不必要的压力。
单例类自己创建自己的唯一实例,并且向其他对象提供这一实例。把构造函数私有,从而避免其他类调用构造函数创建实例。单例模式的缺点是需要维护大量模版代码,且模版代码与业务代码混在一起。单例分为eager和lazy两种模式如下:


需要注意,lazy单例并非线程安全的,可通过synchronised、volatile等关键字保证线程安全。
3. 建造者模式- builder
如StringBuilder;再比如CustomerBuild.withXX("xx").withYY("yy").build();
Builder接口通常有两个方法:withXX等设置各个属性方法、build/getResult方法用于获取最终组装出来的对象。


4. 原型模式 - prototype
原型模式通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。简言之就是复制粘贴。原型类需要实现Cloneable接口,对于深拷贝还需要重写clone方法。
拷贝分为浅拷贝与深拷贝。浅拷贝只克隆按值传递的数据如基本数据类型、String,不复制对象类型,也就是说本体和拷贝的对象类型的属性仍然指向相同的内存地址,如果修改该对象属性,则本体、拷贝的该属性值都会被改变。
网友评论