`

设计模式之 Flyweight - 享元模式

阅读更多

Flyweight模式也叫享元模式,是由GoF提出的23种设计模式中的一种。Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。

本文介绍设计模式中的享元(Flyweight)模式的概念,用法,以及实际应用中怎么样使用Flyweight模式进行开发。
Flyweight模式的概念

Flyweight通过与其他类似对象共享数据来减小内存占用。简单地说,Flyweight模式为类的所有具有相同状态的对象分配同一个实例来达到减小内存占用的目的。

我们通过Flyweight模式的类图来说明Flyweight模式:

[出自:维基百科wikipedia.org]

Flyweight
    目标类。需要与其他类似对象共享数据来减小内存占用的某一类事物的抽象
FlyweightFactory
    对Flyweight实例提供管理的类


调用方在生成Flyweight实例时,不直接通过new的方式而是通过FlyweightFactory#getFlyweight()取得Flyweight的一个实例。
而FlyweightFactory 对象对Flyweight实例进行管理:
调用时当Flyweight的相应实例还未生成时,则:
1,生成Flyweight实例
2,将生成的Flyweight实例保存到对象池中(pooling)
3,返回该Flyweight实例

调用时当Flyweight的相应实例已经生成时,则:
1,从对象池取出该Flyweight实例
2,返回该Flyweight实例

通过以上处理,一方面,FlyweightFactory可以在对象池里只保存最少限度的Flyweight实例;另一方面,调用方可以不用理会FlyweightFactory的内部实现细节而可以取得Flyweight实例。


Flyweight模式的实现范例
我们以公交公司的公交车为例:某公交公司有编号为A,B,C,D的公交车,同一编号的公交车最多只有一辆,对于需要使用这些公交车的任何客户,通过同一编号取车的话,不管是谁,取出来的都是同一辆车。这种情况,我们可以用Flyweight模式来实现。

代码:
import java.util.HashMap;
import java.util.Map;

/** Flyweight */
class Bus {
    private String number;

    public Bus(String number) {
        this.number = number;
    }

    public void printNumber() {
        System.out.println(number);
    }
}

/** FlyweightFactory */
class BusFactory {
    Map<String, Bus> pool;
    public BusFactory(){
        this.pool = new HashMap<String, Bus>();
    }
    public Bus getBus(String number){
        Bus bus = this.pool.get(number);
        if(bus == null) {
            bus = new Bus(number);
            this.pool.put(number, bus);
        }
        return bus;
    }
}

//Test:
public class Client {
    public static void main(String []args) {
        BusFactory busFactory = new BusFactory();
        Bus bus1 = busFactory.getBus("A");
        Bus bus2 = busFactory.getBus("B");
        Bus bus3 = busFactory.getBus("C");
        Bus bus4 = busFactory.getBus("D");
        Bus bus5 = busFactory.getBus("E");
        Bus bus6 = busFactory.getBus("B");


        bus1.printNumber();
        bus2.printNumber();
        bus3.printNumber();
        bus4.printNumber();
        bus5.printNumber();
        bus6.printNumber();

        System.out.println("bus2 = bus6:" + bus2.equals(bus6));
    }
}


运行并显示Client:
C:\Flyweight>javac *.java
C:\Flyweight>java Client
A
B
C
D
E
B
bus2 = bus6:true
C:\Flyweight>

Flyweight模式使用提示
Flyweight模式一般用于外部操作不改变Flyweight实例状态的情况下。因为如果外部操作取出了Flyweight的一个实例并在外部改变了其状态后,下一次操作取得的同一个Flyweight实例可能并具有我们所要求的状态了。
需要删除Flyweight某实例时,应该通过FlyweightFactory加以删除。
为了调用方便,FlyweightFactory类一般使用Singleton模式实现。


Flyweight模式与工厂模式的区别
有关工厂模式的文章请参考:
设计模式之Abstract Factory - 抽象工厂模式
设计模式之Factory Method - 工厂方法模式

通过比较,我们可以发现Flyweight模式与工厂模式存在某些相似之处:都提供了对象工厂的功能,生成了类的实例供外部调用。
但Flyweight模式的目的是使某些相似对象共用类的同一个实例以达到节省内存空间的目的;工厂模式则不强制这一点,它只是负责生成类的实例,另外,工厂模式还通过工厂的继承来生成具有继承关系的不同类的实例,而Flyweight模式不强调这一点。
分享到:
评论

相关推荐

    设计模式学习笔记--Flyweight享元模式.docx

    享元模式是一种设计模式,属于构造型模式,其主要目的是减少对象的数量,通过共享大量相似对象的内部状态来节省内存。这种模式在处理大量细粒度对象时特别有用,能够有效地提高系统的性能。 享元模式的核心是...

    c++-设计模式之享元模式(Flyweight)

    享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建大量小对象所带来的内存开销。通过共享对象,享元模式能够有效地支持大量细粒度的对象,减少内存使用并提高性能。它常用于需要大量重复对象的场景...

    C#设计模式之Flyweight

    "Flyweight"(享元)设计模式是一种结构型模式,其核心目的是为了有效地支持大量细粒度对象的创建和使用,通过共享已经存在的对象来减少内存消耗,提高系统性能。在C#中,Flyweight模式尤其适用于那些内部状态可共享...

    设计模式(C#)之享元模式(Flyweight Pattern)

    享元模式是设计模式中的一种结构型模式,它主要通过共享已有对象来减少内存中对象的数量,从而提高系统性能。在C#编程中,享元模式尤其适用于那些创建大量相似对象且内存消耗较大的场景。本篇文章将深入探讨享元模式...

    学习php设计模式 php实现享元模式(flyweight)

    享元模式(Flyweight Pattern)是软件设计中的一种结构型设计模式,它通过共享技术来支持大量细粒度的对象,以此来降低内存中对象的数量。在PHP中实现享元模式,可以帮助我们优化程序性能,特别是在对象数目过多时,...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 享元模式(Flyweight):使用共享对象,有效地支持大量细粒度的对象。 3. **行为型模式**:这类模式关注对象之间的责任分配。 - 责任链模式(Chain of Responsibility):避免将请求的发送者和接收者耦合在一起...

    6.设计模式-享元模式1

    设计模式-享元模式 设计模式是软件设计中的一种解决方案,旨在提高代码的可维护性、灵活性和可重用性。享元模式(Flyweight Pattern)是结构型模式的一种,主要用于减少大量相似对象的内存占用,提高系统的性能和...

    java基础设计模式模式 - 享元模式.7z

    享元模式是一种优化资源使用的软件设计模式,尤其适用于对象创建成本较高或系统内存有限的场景。在Java编程中,享元模式通过共享已有对象来减少内存中的对象数量,从而提高性能。这种模式的核心是实现细粒度对象的...

    c++设计模式-结构型模式-享元模式

    c++设计模式-结构型模式-享元模式;qt工程;c++简单源码; 享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类...

    设计模式之轻量级Flyweight

    本文将深入探讨“轻量级”设计模式之一——Flyweight(享元)模式,它是如何在减少内存消耗的同时提高系统性能的。 Flyweight模式的核心思想是共享对象,通过复用大量相似对象来减少内存占用。这种模式通常在处理...

    C++设计模式课件13_Flyweight_享元模式.pdf

    ### C++设计模式之享元模式详解 #### 一、享元模式概述 享元模式(Flyweight Pattern)是设计模式中的一种优化模式,主要用于减少创建大量相似对象所需的内存消耗。在C++程序设计中,当系统中存在大量的相同或相似...

    享元模式flyweight

    享元模式(Flyweight Pattern)是一种结构型设计模式,它能有效地减少系统中对象的数量,从而降低内存消耗,提高性能。这种模式通过共享大量相似对象的内部状态来达到这一目标,而只保留对象的外部状态在外部管理。...

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    设计模式专题之(十二)享元模式---设计模式享元模式示例代码(python--c++)

    享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到提高系统性能的目的。在大型软件系统中,特别是在处理大量相似对象时,享元模式能够有效地减少内存开销,提高系统运行效率。在这...

    设计模式----命令模式

    享元模式则是一种结构型设计模式,它能通过共享技术有效地支持大量细粒度的对象。当系统中存在大量相似对象时,享元模式可以极大地减少内存的占用。享元模式通常与Flyweight接口、Concrete Flyweight(具体享元)、...

    JAVA设计模式chm文档

    设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy...

    C++设计模式之享元模式(Flyweight)

    C++设计模式之享元模式(Flyweight) C++设计模式之享元模式(Flyweight)是一种结构型设计模式,主要用于解决大量相似对象的创建和操作所带来的内存负载问题。该模式的主要设计目标是通过共享对象来减少内存负载,...

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)

    在这个“C#面向对象设计模式纵横谈(12)”中,我们将深入探讨享元模式的概念、实现方式以及如何在实际项目中应用。 享元模式的核心思想是区分对象的状态和行为。状态分为内部状态和外部状态,其中内部状态是对象共有...

    设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在大量对象创建时。享元模式通过共享已有对象来减少内存中对象的数量,从而达到降低内存消耗的效果。这种模式适用于那些轻量级对象,...

    总结JavaScript设计模式编程中的享元模式使用

    享元模式是软件工程中一种用于优化性能的设计模式,它通过共享相似对象的实例来减少内存使用或者计算的开销。在JavaScript编程中,尤其是处理DOM操作和大量相似对象时,享元模式的使用尤为关键。 享元模式的主要...

Global site tag (gtag.js) - Google Analytics