博客
关于我
Java原型模式(Prototype模式)
阅读量:793 次
发布时间:2023-01-28

本文共 2276 字,大约阅读时间需要 7 分钟。

Prototype模式与Flyweight模式分析

Prototype模式(原型模式)是一种创建对象的模式,通过拷贝一个原型对象创建新的对象。这种方式无需了解对象的创建细节,让对象可以通过拷贝自身实现自我复制。

Prototype模式概述

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;        }    }}

具体实现类如SoupSpoonSaladSpoon仅需要继承AbstractSpoon并初始化属性即可。调用时,可以直接实例化并使用,无需显式管理复制行为。

Flyweight模式(共享模式)

Flyweight模式的目标是减少重复对象,通过共享对象的内部状态来避免内存浪费。这种模式将对象的静态部分(内在状态)共享,允许对象在特定情境下共享状态,而不影响其他情境的行为表现。

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数据中的应用

在处理大量相同数据时,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/

你可能感兴趣的文章
java.lang.ClassNotFoundException: com.fasterxml.classmate.TypeResolver
查看>>
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
查看>>
java.lang.IllegalArgumentException: Control character in cookie value or attribute.
查看>>
java.lang.IllegalArgumentException: Invalid character found in the request target.
查看>>
java.lang.IllegalStateException: Optional int parameter 'id' is not present but cannot be translated
查看>>
java.lang.NoClassDefFoundError: javax transaction SystemException 解决方法!
查看>>
java.lang.NoClassDefFoundError: javax/persistence/EntityListeners解决
查看>>
java.lang.NoClassDefFoundError: kotlin/reflect/jvm/internal/KotlinReflectionInternalError
查看>>
java.lang.NoClassDefFoundError: org.joda.time.ReadablePeriod错误的处理
查看>>
java.lang.NoClassDefFoundError: org/springframework/core/io/Resource
查看>>
java.lang.NoSuchMethodError: org.jaxen.dom4j.DocumentNavigator.getInstance()【可能的解决办法】
查看>>
java农业文化旅游管理平台(ssm)
查看>>
java农副产品网上预订系统(ssm)
查看>>
java农副产品购物app的设计与开发(ssm)
查看>>
java农家乐客户管理系统(ssm)
查看>>
Java分布式
查看>>
JAVA分布式系统
查看>>
java分布式链路追踪;jvm应用监控-skywalking
查看>>
java分库分表
查看>>
Java创建elasticsearch的model时,如何配置使用ik分词器?
查看>>