欢迎光临散文网 会员登陆 & 注册

Java设计模式之-享元模式

2023-08-29 22:26 作者:bili_52912388700  | 我要投稿

什么是享元模式?

享元模式是一种设计模式,用于减少对象的内存占用和提高性能。它通过共享相似对象的内部状态来减少重复对象的创建。


主要解决什么问题?

享元模式主要解决两个问题:


大量相似对象的内存占用:当系统中存在大量相似的对象时,每个对象都会占用一定的内存空间,导致内存消耗过大。

对象的创建和销毁开销:频繁创建和销毁对象会带来一定的开销,影响系统性能。

在什么时候我们需要使用享元模式?

当满足以下条件时,可以考虑使用享元模式:


系统中存在大量相似的对象,且这些对象的区别可以拆分为内部状态和外部状态。

对象的创建和销毁频率较高,需要减少对象的内存占用和创建销毁开销。

用一个生活中的应用实例来举例、类比

假设你正在开发一个电子商务网站,你需要展示大量的产品信息。每个产品都有一些共同的属性,比如名称、价格和库存数量,以及一些不同的属性,比如颜色和尺寸。这里,产品可以被看作是享元对象。


使用享元模式,你可以将共同属性作为内部状态,而将不同的属性作为外部状态。当展示产品时,可以共享相同内部状态的产品对象,并根据不同的外部状态设置其属性值。通过共享对象,可以减少内存占用,避免创建大量相似的产品对象。


优点

享元模式的优点包括:


减少内存占用:通过共享相似对象的内部状态,减少内存占用。

提高性能:共享对象的复用减少了对象的创建和销毁开销,提高了系统性能。

缺点

享元模式的缺点包括:


引入共享对象管理:引入共享对象需要额外的管理机制,增加了系统的复杂性。

对象状态共享:共享对象的内部状态需要是可共享的,如果对象有可变状态,则需要进行额外的处理。

使用场景

享元模式适用于以下情况:


系统中存在大量相似的对象,且这些对象的区别可以拆分为内部状态和外部状态。

对象的创建和销毁频率较高,需要减少对象的内存占用和创建销毁开销。

下面是一个简单的Java代码示例:

import java.util.HashMap;

import java.util.Map;


// 享元接口

interface Product {

    void display(String color);

}


// 具体享元类

class ConcreteProduct implements Product {

    private String name;


    public ConcreteProduct(String name) {

        this.name = name;

    }


    public void display(String color) {

        System.out.println("Displaying " + name + " in " + color);

    }

}


// 享元工厂类

class ProductFactory {

    private Map<String, Product> productMap;


    public ProductFactory() {

        productMap = new HashMap<>();

    }


    public Product getProduct(String name) {

        Product product = productMap.get(name);


        if (product == null) {

            product = new ConcreteProduct(name);

            productMap.put(name, product);

        }


        return product;

    }

}


// 客户端

public class Client {

    public static void main(String[] args) {

        ProductFactory productFactory = new ProductFactory();


        Product product1 = productFactory.getProduct("Product A");

        product1.display("Red");


        Product product2 =productFactory.getProduct("Product A");

        product2.display("Blue");


        Product product3 = productFactory.getProduct("Product B");

        product3.display("Green");

    }

}

在这个示例中,Product 接口定义了 display 方法,表示产品的展示。ConcreteProduct 是具体的享元类,实现了 Product 接口,并包含一个内部状态 name 。ProductFactory 是享元工厂类,负责创建和管理产品对象。在客户端代码中,通过工厂类获取产品对象,并调用 display 方法展示产品。


通过使用享元模式,当获取相同名称的产品时,只会创建一个对象并进行共享,从而减少了内存占用和对象的创建开销。


Java设计模式之-享元模式的评论 (共 条)

分享到微博请遵守国家法律