本文共 2276 字,大约阅读时间需要 7 分钟。
Prototype模式与Flyweight模式分析
Prototype模式(原型模式)是一种创建对象的模式,通过拷贝一个原型对象创建新的对象。这种方式无需了解对象的创建细节,让对象可以通过拷贝自身实现自我复制。
Prototype模式的核心思想是:将原型对象作为模板,通过拷贝原型对象创建新的对象。这种方式特别适用于对象具有大型状态或结构时,避免每次创建新对象都需要复制大量数据,节省内存资源。 Prototype模式常用于解决对象复制问题,适用于需要频繁创建大量对象的情况。
Prototype模式可以通过Java中的clone()
方法来实现。在设计中,通常引入一个抽象类AbstractSpoon
,实现Cloneable
接口,所有具体实现都继承自这个抽象类。AbstractSpoon
定义了一个clone()
方法,可以实现对象的浅拷贝(深拷贝需要自行处理)。
public abstract class AbstractSpoon implements Cloneable { String spoonName; public void setSpoonName(String spoonName) { this.spoonName = spoonName; } public String getSpoonName() { return this.spoonName; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException exception) { System.err.println("AbstractSpoon is not Cloneable"); return null; } }}
具体实现类如SoupSpoon
和SaladSpoon
仅需要继承AbstractSpoon
并初始化属性即可。调用时,可以直接实例化并使用,无需显式管理复制行为。
Flyweight模式的目标是减少重复对象,通过共享对象的内部状态来避免内存浪费。这种模式将对象的静态部分(内在状态)共享,允许对象在特定情境下共享状态,而不影响其他情境的行为表现。
Flyweight模式通常与工厂模式结合使用,通过一个工厂维护一个“模式池”,存储已创建的对象,下次使用时只需从池中获取已经存在的对象或新创建一个并保存。
public class ConcreteFlyweight implements Flyweight { private IntrinsicState state; public void operation(ExtrinsicState state) { // 具体操作逻辑 }}public class ArtistFactory { private Hashtable pool = new Hashtable(); public Artist getArtist(String key) { Artist result = (Artist) pool.get(key); if (result == null) { result = new Artist(key); pool.put(key, result); } return result; }}
在处理大量相同数据时,Flyweight模式特别有用。例如,读取XML中的CD信息,其中歌手(Artist)的信息通常会重复出现。我们可以通过Flyweight模式共享这些重复的对象。
Another Green World 1978 Eno, Brian Greatest Hits 1950 Holiday, Billie Taking Tiger Mountain (by strategy) 1977 Eno, Brian
通过定义一个Artist
类,并使用ArtistFactory
管理共享对象,可以在处理这些CD数据时显著节省内存资源。
Prototype模式和Flyweight模式都是在Java中优化对象创建和状态管理的关键模式。Prototype模式通过拷贝原型对象实现对象创建,适合需要频繁创建对象但状态复杂的情况。Flyweight模式则通过共享对象内部状态,减少内存占用,适合处理大量相同对象的情况。在实际应用中,两种模式常常结合使用,以达到更高效率和性能表现。
转载地址:http://lnryk.baihongyu.com/