设计模式学习08:享元模式

设计模式学习08:享元模式

参考资料

https://www.jianshu.com/p/a2aa75939766

https://www.cnblogs.com/adamjwh/p/9070107.html

简介

  Use sharing to support large numbers of fine-grained objects efficiently.

  使用共享对象可有效地支持大量的细粒度的对象。

  享元模式(Flyweight)又称为 轻量级模式,它是一种对象结构型模式。

  面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式 正是为解决这一类问题而诞生的。

  享元模式 是对象池的一种实现。类似于线程池,线程池可以避免不停的创建和销毁多个对象,消耗性能。享元模式 也是为了减少内存的使用,避免出现大量重复的创建销毁对象的场景。

  享元模式 的宗旨是共享细粒度对象,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗。

  享元模式 把一个对象的状态分成内部状态和外部状态,内部状态即是不变的,外部状态是变化的;然后通过共享不变的部分,达到减少对象数量并节约内存的目的。

  享元模式 本质:缓存共享对象,降低内存消耗

主要解决

  当系统中多处需要同一组信息时,可以把这些信息封装到一个对象中,然后对该对象进行缓存,这样,一个对象就可以提供给多处需要使用的地方,避免大量同一对象的多次创建,消耗大量内存空间。

  享元模式 其实就是 工厂模式 的一个改进机制,享元模式 同样要求创建一个或一组对象,并且就是通过工厂方法生成对象的,只不过 享元模式 中为工厂方法增加了缓存这一功能。

优点

  享元模式 可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一份,降低内存占用,增强程序的性能;

  享元模式 的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享;

缺点

  享元模式 使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化;

  为了使对象可以共享,享元模式 需要将享元对象的状态外部化,而且外部状态必须具备固化特性,不应该随内部状态改变而改变,否则会导致系统的逻辑混乱;

使用场景

  系统中存在大量的相似对象;

  细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份;

  需要缓冲池的场景;

经典案例

抽象父类
public abstract class FlyWeight {

    public String intrinsic;

    protected final String extrinsic;

    public FlyWeight(String extrinsic) {
        this.extrinsic = extrinsic;
    }

    public abstract  void operate(int extrinsic);

    public String getIntrinsic() {
        return intrinsic;
    }

    public void setIntrinsic(String intrinsic) {
        this.intrinsic = intrinsic;
    }
}

//共享子类
public class ConcreteFlyWeight extends  FlyWeight {

    public ConcreteFlyWeight(String extrinsic) {
        super(extrinsic);
    }

    @Override
    public void operate(int extrinsic) {
        System.out.println("共享的具体FlyWright:" + extrinsic);
    }
}
//不共享子类
public class UnsharedConcreteFlyweight extends  FlyWeight {

    public UnsharedConcreteFlyweight(String extrinsic) {
        super(extrinsic);
    }

    @Override
    public void operate(int extrinsic) {
        System.out.println("不共享的具体FlyWright:" + extrinsic);
    }
}
//工厂
public class FlyweightFactory {

    private static HashMap<String, FlyWeight> pool = new HashMap<>();

    public static FlyWeight getFlyweight(String extrinsic){
        FlyWeight flyWeight = null;
        if(pool.containsKey(extrinsic)){
            flyWeight = pool.get(extrinsic);
            System.out.print("已有 " + extrinsic + " 直接从池中取---->");
        }else{
            flyWeight = new ConcreteFlyWeight(extrinsic);
            pool.put(extrinsic,flyWeight);
            System.out.print("创建 " + extrinsic + " 并从池中取出---->");
        }
        return flyWeight;
    }
}
//客户端测试
public class Client {

    public static void main(String[] args) {
        int extrinsic = 22;

        FlyWeight flyweightX = FlyweightFactory.getFlyweight("X");
        flyweightX.operate(++ extrinsic);

        FlyWeight flyweightY = FlyweightFactory.getFlyweight("Y");
        flyweightY.operate(++ extrinsic);

        FlyWeight flyweightZ = FlyweightFactory.getFlyweight("Z");
        flyweightZ.operate(++ extrinsic);
        FlyWeight flyweightReX = FlyweightFactory.getFlyweight("X");
        flyweightReX.operate(++ extrinsic);

        FlyWeight unsharedFlyweight = new UnsharedConcreteFlyweight("X");
        unsharedFlyweight.operate(++ extrinsic); }
}
测试结果
创建 X 并从池中取出---->共享的具体FlyWright:23
创建 Y 并从池中取出---->共享的具体FlyWright:24
创建 Z 并从池中取出---->共享的具体FlyWright:25
已有 X 直接从池中取---->共享的具体FlyWright:26
不共享的具体FlyWright:27

原文地址:https://www.cnblogs.com/wobuchifanqie/p/11993208.html

时间: 2024-10-13 08:38:00

设计模式学习08:享元模式的相关文章

设计模式学习笔记--享元模式

1 using System; 2 3 namespace FlyWeight 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/6/2 7:21:28 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// FlyWeight说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址 10 /// </summary> 11 public abstract cla

23种设计模式学习之享元模式

典型:各种连接池 public class ConnectionPool { private Vector<Connection> pool; /*公有属性*/ private String url = "jdbc:mysql://localhost:3306/test"; private String username = "root"; private String password = "root"; private Strin

大话设计模式Python实现- 享元模式

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象. 下面是一个享元模式的demo: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 """ 6 大话设计模式 7 设计模式--享元模式 8 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象 9 对一个类进行的实例,只在第一次使用时建立,其他时候是用同一个

java设计模式 GOF23 11 享元模式

一.享元模式简介 如果有很多相同或者相似的对象可以使用享元模式,从而节约内存. 二.关键点 享元对象需要区分内部状态和外部状态. 内部状态:可以共享,不会随着外部状态改变. 外部状态:不可以共享,随外部状态改变. 享元共享类实现享元池管理享元对象. 三.简单实现 package com.lz.flyWeight; /* * 享元模式 * 内部状态 * 模拟棋盘,因为一盘棋其中棋子的颜色都一样 * 只有位置不一样,所以可以将颜色共享,这样可以节省内存空间 * 棋盘接口 */ interface C

Java设计模式之《享元模式》及应用场景

原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在. 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用.这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象.这个对象就可以避免到修改的问题. 享元的目的是为了减少不会要额内存消耗,将多个对同一对象的访

设计模式--13、享元模式

享元模式: 先让我们来看一个应用场景: 比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象.如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了.那么如果要是每个字母都共享一个对象,那么就大大节约了资源.也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象. 在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式.Flyw

[设计模式] javascript 之 享元模式;

享元模式说明 定义:用于解决一个系统大量细粒度对象的共享问题: 关健词:分离跟共享: 说明: 享元模式分单纯(共享)享元模式,以及组合(不共享)享元模式,有共享跟不共享之分:单纯享元模式,只包含共享的状态,可共享状态是不可变,不可修改的,这是享元的内部状态:当然有外部状态就有外部状态,外部状态是可变的,不被共享,这个外部状态由客户端来管理,是可变化的:外部状态与内部状态是独立分开的,外部状态一般作为参数传入享元对象内,但不会影响内部状态的值:外部状态,一用用于获取共享的享元对象,或多或少与内部状

《Java设计模式》之享元模式

Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. Java中的String类型 在JAVA语言中,String类型就是使用了享元模式.String对象是final类型,对象一旦创建就不可改变.在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝.Stri

再战设计模式(十一)之享元模式

享元模式 场景: 内存属于稀缺资源,不要随便浪费.如果有很多个完全相同或相似的 对象,我们可以通过享元模式,节省内存. 核心: 本质:享元模式以共享的方式高效地支持大量细粒度对象的重用 享元对象能做到共享的关键是区分了内部状态和外部状态 内部状态:可以共享,不会随环境变化而改变 外部状态:不可以共享,会随环境变化而改变 现在有个需求,需要为围棋设置一个程序,那么围棋的棋子改如何设计?总共有很多黑子和白子,难道我们需要为每一个棋子生成一个对象吗? 显然这样的设计是不合理的.这个时候我们就可以用到享

Java设计模式:Flyweight(享元)模式

概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对象则创建新对象,从而减少系统中重复创建对象实例的性能和内存消耗. 享元模式将对象的信息分为两个部分:内部状态(Internal State)和外部状态(External State).内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变.外部状态是随环境改变而改变的.不可共享的