设计模式之享元模式:如何通过共享对象减少内存加载消耗?

在上一讲中,我们介绍了门面模式,门面模式应用广泛,不仅可以在架构设计层面组合不同的子系统来完成庞大功能(比如,电商系统),而且还可以在代码级别用于对象之间的调用解耦。

今天我们继续学习另外一种结构型模式——享元模式。享元模式的原理和实现都很简单,但是应用场景却相对狭窄,它和现在我们所熟知的缓存模式、池化模式有所联系,却又有不同。学习完今天这一讲后,相信你会找到这个不同之处。

那么,话不多说,让我们开始今天的学习吧。

模式原理分析

享元模式的原始定义是:摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,从而让我们能在有限的内存容量中载入更多对象。

从这个定义中你可以发现,享元模式要解决的核心问题就是节约内存空间,使用的办法是找出相似对象之间的共有特征,然后复用这些特征

我们先来看看 UML 图是如何表示享元模式的,如下图:

图片1.png

从这个 UML 图中,我们能看出享元模式包含的关键角色有四个。

  • 享元类(Flyweight):定义了享元对象需要实现的公共操作方法。在该方法中会使用一个状态作为输入参数,也叫外部状态,由客户端保存,在运行时改变。

  • 享元工厂类(Flyweight Factory):管理一个享元对象类的缓存池。它会存储享元对象之间需要传递的共有状态,比如,按照大写英文字母来作为状态标识,这种只在享元对象之间传递的方式就叫内部状态。同时,它还提供了一个通用方法 getFlyweight(),主要通过内部状态标识来获取享元对象。

  • 可共享的具体享元类(ConcreteFlyweight):能够复用享元工厂内部状态并实现享元类公共操作的具体实现类。

  • 非共享的具体享元类(UnsharedConcreteFlyweight):不复用享元工厂内部状态,但实现享元类的具体实现类。

为帮助你更准确地理解,这里我们稍微拓展一下,简单介绍下内部状态和外部状态。

  • 内部状态:不会随环境改变而改变的状态,俗称不可变对象。比如,在 Java 中 Integer 对象初始化就是缓存 -127 到 128 的值,无论怎么使用 Integer,这些值都不会变化。

  • 外部状态:随环境改变而改变的状态。通常是某个对象所独有的,不能被共享,因此,也只能由客户端保存。之所以需要外部状态就是因为客户端需要不同的定制化操作。

下面我们再来看看 UML 对应的代码实现:

//享元类

public interface Flyweight {

    void operation(int state);

}

//享元工厂类

public class FlyweighFactory {

    // 定义一个池容器

    public Map<String,Flyweight> pool = new HashMap<>();

    public FlyweighFactory() {

        pool.put("A", new ConcreteFlyweight("A"));//将对应的内部状态添加进去

        pool.put("B", new ConcreteFlyweight("B"));

        pool.put("C", new ConcreteFlyweight("C"));

    }

    //根据内部状态来查找值

    public Flyweight getFlyweight(String key) {

        if (pool.containsKey(key)) {

            System.out.println("===享元池中有,直接复用,key:"+key);

            return pool.get(key);

        } else {

            System.out.println("===享元池中没有,重新创建并复用,key:"+key);

            Flyweight flyweightNew = new ConcreteFlyweight(key);

            pool.put(key,flyweightNew);

            return flyweightNew;

        }

    }

}

//共享的具体享元类

public class ConcreteFlyweight implements Flyweight {

    private String uniqueKey;

    public ConcreteFlyweight(String key) {

        this.uniqueKey = key;

    }

    @Override

    public void operation(int state) {

        System.out.printf("=== 享元内部状态:%s,外部状态:%s%n",uniqueKey,state);

    }

}



//非共享的具体享元类

public class UnsharedConcreteFlyweight implements Flyweight {

    private String uniqueKey;

    public UnsharedConcreteFlyweight(String key) {

        this.uniqueKey = key;

    }

    @Override

    public void operation(int state) {

        System.out.println("=== 使用不共享的对象,内部状态:"+uniqueKey+",外部状态:"+state);

    }

}



输出结果:

====享元池中有,直接复用,key:A

=== 享元内部状态:A,外部状态:9

====享元池中有,直接复用,key:B

=== 享元内部状态:B,外部状态:8

====享元池中没有,重新创建并复用,key:D

=== 享元内部状态:D,外部状态:7

====创建不共享的对象,key:uX

=== 使用不共享的对象,内部状态:uX,外部状态:6

这段代码实现非常简单,不过这里你可能会联想到缓存模式,比如,LRU 缓存模式。但这两者是完全不同的设计意图,它们的本质区别在于:享元模式要解决的问题是节约内存的空间大小,而缓存模式本质上是为了节省时间

回到上面的代码分析中,我们能看出享元模式封装的变化有:

  • 对象内部状态的定义规则,比如,是通过字母共享状态,还是通过固定的数字来共享状态;

  • 具体享元对象所实现的公共操作的逻辑。

所以说,享元模式本质上是通过创建更多的可复用对象的共有特征来尽可能地减少创建重复对象的内存消耗

使用场景分析

一般来讲,享元模式常用的使用场景有以下几种。

  • 系统中存在大量重复创建的对象。比如,同一个商品的展示图片、详情介绍、文字介绍等,当自营商家系统调用或第三方商家调用时,商品系统可以使用同一个对象来节省内存空间。

  • 可以使用外部特定的状态来控制使用的对象。比如,使用常用的中文汉字作为读取的标识,读取享元池中共享的多个中文汉字对象。

  • 相关性很高并且可以复用的对象。比如,公司的组织结构人员基本信息、网站的分类信息列表等。

在现实中,享元模式最常使用的场景是在编辑器软件中,比如,在一个文档中多次出现相同的图片,则只需要创建一个图片对象,通过在应用程序中设置该图片出现的位置,就可以实现该图片在不同地方多次重复显示的效果。

在 Java 中,享元模式一个常用的场景就是,使用数据类的包装类对象的 valueOf() 方法。比如,使用 Integer.valueOf() 方法时,实际的代码实现中有一个叫 IntegerCache 的静态类,它就是一直缓存了 -127 到 128 范围内的数值,如下代码所示,你可以在 Java JDK 中的 Integer 类的源码中找到这段代码。

public static Integer valueOf(int i) {

	if (i >= IntegerCache.low && i <= IntegerCache.high)

		return IntegerCache.cache[i + (-IntegerCache.low)];

    return new Integer(i);

}

你会发现,享元模式本质上在使用时就是找到不可变的特征,并缓存起来,当类似对象使用时从缓存中读取,以达到节省内存空间的目的。比如,在需要承接大流量的系统中使用图片,我们都知道高清图片即便是压缩后占用的内存空间也很大,那么在使用图片时节省内存空间就是首要考虑的设计因素,而享元模式可以很好地帮助我们解决这类问题场景。

为什么使用享元模式?

分析完享元模式的原理和使用场景后,我们再来说说使用享元模式的原因,主要有以下两个。

第一个,减少内存消耗,节省服务器成本。 比如,当大量商家的商品图片、固定文字(如商品介绍、商品属性)在不同的网页进行展示时,通常不需要重复创建对象,而是可以使用同一个对象,以避免重复存储而浪费内存空间。由于通过享元模式构建的对象是共享的,所以当程序在运行时不仅不用重复创建,还能减少程序与操作系统的 IO 交互次数,大大提升了读写性能。

第二个,聚合同一类的不可变对象,提高对象复用性。 比如,Java 中的 Number 对象族类(Integet、Long、Double 等)都是使用了享元模式例子,通过缓存不同范围数值来重复使用相同的数值。

收益什么?损失什么?

通过上面的分析,我们可以得出使用享元模式主要有以下优点。

  • 可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一份。

  • 通过封装内存特有的运行状态,达到共享对象之间高效复用的目的。

同样,享元模式也不是万能的,它也有一些缺点。

  • 以时间换空间,间接增加了系统的实现复杂度。比如,需要分离出内部状态和外部状态,其中,外部状态这个定义比较模糊,也很难统一,而内部状态除了一些常用的常量容易被找到以外,那些更通用的组件对象在不同的业务系统中其实是不容易被找到的,因为不同的人对相似对象的理解并不一致,这就需要对程序员的代码设计实现思维有一定的要求。

  • 运行时间更长,对于一些需要快速响应的系统并不合适。享元模式的目的是节省空间,而没有说需要提供更短的时间,这适合数据类项目的使用,而不适合一些有高并发要求的系统。

总结

享元模式为共享对象定义了一个很好的结构范例。不过,用好享元模式的关键在于找到不可变对象,比如,常用数字、字符等。

之所以做对象共享而不是对象复制的一个很重要的原因,就在于节省对象占用的内存空间大小。缓存模式和享元模式最大的区别就是:享元模式强调的是空间效率,比如,一个很大的数据模型对象如何尽量少占用内存并提供可复用的能力;而缓存模式强调的是时间效率,比如,缓存秒杀的活动数据和库存数据等,数据可能会占用很多内存和磁盘空间,但是得保证在大促活动开始时要能及时响应用户的购买需求。也就是说,两者本质上解决的问题类型是不同的。

虽然享元模式的应用不如缓存模式多,但是对于超大型数据模式来说,它却是非常有效的优化方法之一。特别是对于现在越来越多的数据系统来说,共享变得更加重要,因为复制虽然时间效率更高,但是空间上可能完全不够。

课后思考

如果现在有一个超出服务器内存大小的对象需要加载使用,你该怎么使用享元模式进行解决呢?

欢迎留言分享,我会第一时间给你回复。

在下一讲,我会接着与你分享“代理模式:如何控制和管理对象的访问?”的相关内容,记得按时来听课!

设计模式享元模式-来点高效省内存的!
ISmileLi的博客
02-23 320
一、享元模式的概念 享元模式属于结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能。 享元模式尝试复用现有的对象实例,如果有就复用,没有再创建,从而达到减少内存占用和提高性能的目的。 二、享元模式使用场景 1、需要以共享的方式,高效的支持大量的细粒度的对象时可以使用享元模式。 2、需要使用缓冲池技术时可以使用享元模式。 三、享元模式构建方法 1、抽象享元类 所有具体享元的父类,给具体...
java设计模式【之】享元模式【源码】【场景:多缓存可选模式
03-27
java设计模式【之】享元模式【源码】【场景:多缓存可选模式】 /** * 享元模式(预单例) * “元” 理解为 “同一地址对象” * 运用共享技术,减少对象的创建,降低对象的数量,降低内存消耗,提高性能 * ...
设计模式——享元模式(可降低程序内存的占用)
Yawn
06-28 213
1. 简介 享元模式是池技术的重要实现方式,它可以减少应用程序创建的对象,降低程序内存的占用,提高程序的性能。 定义:使用共享对象有效地支持大量细粒度的对象 要求细粒度对象,那么不可避免地使得对象数量多且性质相近。这些对象分为两个部分:内部状态和外部状态。 内部状态是对象共享出来的信息,存储在享元对象内部并且不会随环境的改变而改变; 而外部状态是对象依赖的一个标记,它是随环境改变而改变的并且不可共享的状态。 享元模式的结构图如图所示。 在享元模式中有如下角色: Flyweight:抽象享元角色,同时定
设计模式享元模式
qq_29860591的博客
01-13 214
享元模式 1 概述 定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。 2 结构 享元(Flyweight )模式中存在以下两种状态: 内部状态,即不会随着环境的改变而改变的可共享部分。 外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两...
设计模式享元模式,如何利用享元模式优化内存占用
OceanStar的博客
01-05 326
享元模式的原理与实现 所谓”享元“,就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元模式是不可变的对象。 具体来讲,当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变对象,我们就可以利用享元模式对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存对象的数量,起到节省内存的目的。实际上,不仅仅相同对象可以设计成享元,对于相似对象,我们也可以将这些对象中相同的部分(字段)提取出来,设计成享元,让这些大量相似对象引用这些享元。 定义中的“不可变对象
看看享元模式给你的程序减少了多少内存
从大数据到人工智能的博客
11-29 201
举个例子 对象创建是OOP中最基本的操作。即使在最微不足道的用例中,也很难计算我们创建的对象的数量(有意或幕后)。 每个对象都是在堆上创建的,在垃圾收集之前都会占用一些空间。长时间运行的程序会占用堆。类似地,同时运行的线程将成倍增所使用的内存。 下面举一个简单的例子: 我有一个应用程序,它返回给我大量的数据点来绘制一个图表。数据点包含两个信息——数据和该点在图上的样子: public class DataPoint { private double data; private Point
java23种设计模式总结.pdf
06-02
7. 享元模式:运用共享技术有效支持大量细粒度的对象减少内存消耗。 行为型模式关注对象之间的交互和责任分配: 1. 策略模式:定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用...
java设计优化之单例模式
09-02
单例模式是一种经典的软件设计模式,它限制一个类只能有一个实例,常用于管理共享资源或者全局配置。在Java中,单例模式的实现方式多种多样,每种方式都有其特点和适用场景。下面我们将深入探讨几种常见的Java单例...
JDBC数据库连接过程及驱动设计模式详解
09-01
此外,数据库连接池技术(如C3P0、HikariCP等)运用了工厂和享元设计模式,它们预先创建并管理一组连接,提供给多个请求共享,从而提高效率并减少资源消耗。 总的来说,JDBC提供了一种标准化的方式与数据库交互,而...
设计模式定义
10-19
22. 享元模式(Flyweight):通过共享技术有效支持大量细粒度的对象减少内存消耗。 理解并熟练应用设计模式,有助于提升软件的可维护性、可扩展性和可复用性,是软件开发者必备的技能之一。在实际开发中,根据...
android中享元模式,Android设计模式-享元模式
weixin_36064196的博客
06-01 176
1.定义享元模式是池技术的重要实现方式。使用共享对象可以有效的支持大量的细粒度的对象享元模式的定义提到了细粒度和共享对象,要求细粒度,那就很可能会产生大量相似对象,由此,在这里需要用到共享技术,来减少大量对象的产生,防止内存的大量消耗。这里引入来内部状态和外部状态两个概念。内部状态内部状态是对象共享出来的信息,储存在对象内部并且不会随着环境的改变而发生改变。他可以作为一个对象的动态附信息,不...
Gof-享元模式
木兮兮
01-26 105
继续打卡设计模式 今天来聊一下享元模式 享元模式 也叫蝇量模式,运用共享技术有效支持大量细粒度的对象 常用于底层系统开发,解决系统的性能问题,像数据库连接池。 一、实际问题 首先提出一个实际的需求 小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网 站,但是要求都有些不同: 有客户要求以新闻的形式发布 有客户人要求以博客的形式发布 有客户希望以微信公众号的形式发布 那么现在解决这个问题我们出发点可能就是说在把原来的东西复制一份然后简单的修改一下。但是大
一篇文章掌握享元模式
Android小白
02-19 120
一.案例引入 1.案例描述 2.传统解决方案 3.传统解决方案评价 需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对象很多,造成服务器的资源浪费 解决思路 整合到一个网站中,共享其相关的代码和数据,对于硬盘、内存、CPU、数据库空间等服务器资源都可以达成共享减少服务器资源浪费 即享元模式 二.享元模式 1.基本介绍 2.享元模式原理图 原理图解释 内部状态和外部状态的实例 内部状态和外部状态的定义 3.享元模式解决上述问题的UML类图
图解Java设计模式享元模式
不一样的花朵的博客
03-25 506
图解Java设计模式享元模式展示网站项目需求传统方案解决网站展现项目传统方案解决网站展现项目 - 问题分析享元模式基本介绍享元模式原理类图内部状态和外部状态享元模式解决网站展现项目享元模式在 JDK - Integer的应用源码分析享元模式的注意事项和细节 展示网站项目需求 小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网 站,但是要求都有些...
设计模式竟然能共享对象享元模式
weixin_44198475的博客
06-28 195
享元模式 1.基本介绍 也叫蝇量模式:运用共享技术有效的支持大量细粒度对象 常用于系统底层开发,解决系统性能问题,比如数据库连接池,可以将共用对象直接拿出来用,避免重新创建 能够解决重复对象内存浪费问题,当系统中有大量相似对象,需要缓冲池时,不需要重新创建,直接从缓冲池中获取 享元模式是池技术的重要实现,String常量池、数据库连接池、缓冲池 2.原理类图 FlyWeightFactory:享元的工厂类,用于构建一个池容器(集合),同时提供从池中获取对象方法 FlyWeight:抽象的享元角色,
如何利用亨元模式优化内存占用
聊技术,谈人生
12-01 168
引言 亨元模式又叫蝇量模式,英文名字是Flyweight,一看这名字就是要给对象进行瘦身的,通过共享内存的方式,减少对象内存占用量。它用来解决“大量且重复的对象”的管理问题。随着计算机设备的不断升级,我们的内存越来越大,CPU频率越来越高,我们渐渐遗忘了在内存受限制的环境下对每一个字节(Byte)都很计较的程序编写方式。但是随着移动互联网的兴起,在手持设备上运行的程序所面临的内存大小受限制的问题又成了我们必须考虑的问题。虽然我们的手机性能也在不断的攀升,但是为了我们在手机端展现的程序...
设计模式享元模式--共享内存来节省空间
Thepatterraining的博客
05-06 290
设计模式享元模式共享内存来节省空间 享元模式是说共享单元,如果有一样的部分那么共享一个组件而不是复制,也就是传址不传值。 运用共享技术有效地支持大量细粒度的对象。 为什么要使用享元模式 享元模式体现在很多地方,比如后端共享一套代码给前端各个平台,很多接口都是同一个。 享元模式是复用性的体现,大量节省了空间。 比如棋牌游戏,棋子和牌都是一样的,那么他们就可以复用同一个。 五子棋游戏 五子棋只...
享元模式(详解版)——小马同学@Tian
SigleDog的博客
11-30 263
享元模式(详解版) 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。 例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景。 享元模式的定义与特点 享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的
Go设计模式--享元模式,节省内存的好帮手
slphahaha的博客
03-23 111
享元模式是一种结构型设计模式, 它的核心思想是通过共享多个对象所共有的相同状态,从而有效的支持在有限的内存入大量细粒度的对象。这里着重介绍一下享元这个名词,享元可以理解为可复用的对象,即可以是对象级别的复用,也可以是对象的字段进行复用(把可复用的字段单独提炼成一个更精细的对象)。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象,不可变对象指的是初始化之后,对象的状态不会改变了,也...
Android 享元设计模式
最新发布
07-28
享元设计模式(Flyweight Design Pattern)是一种用于优化大量对象创建和使用的设计模式。在Android开发中,使用享元模式可以有效地减少内存消耗和提高性能。 在享元模式中,对象被分为两种状态:内部状态和外部状态。内部状态是不变的,可以被多个对象共享,而外部状态是可变的,每个对象都有自己的外部状态。 在Android中,典型的例子是使用Bitmap对象来显示图片。当需要显示多个相同的图片时,可以使用享元模式共享的Bitmap对象,而不是每次都创建新的Bitmap对象。 以下是一个简单的示例代码: ```java public class BitmapFactory { private Map<String, Bitmap> bitmapCache = new HashMap<>(); public Bitmap getBitmap(String path) { Bitmap bitmap = bitmapCache.get(path); if (bitmap == null) { // 如果缓存中没有该Bitmap对象,则创建新的Bitmap对象 bitmap = BitmapFactory.decodeFile(path); bitmapCache.put(path, bitmap); } return bitmap; } } ``` 在上面的示例中,`BitmapFactory` 类使用一个 `bitmapCache` Map 来缓存已的 Bitmap 对象。当需要获取 Bitmap 对象时,首先从缓存中查找,如果找到则返回缓存的对象,否则创建新的 Bitmap 对象并存入缓存。 通过使用享元模式,可以避免重复创建相同的 Bitmap 对象,从而减少内存消耗。这在需要频繁和显示大量图片的应用中非常有用。 需要注意的是,享元模式适用于有大量相似对象的情况,并且需要权衡共享对象和创建对象的开销。在某些情况下,过度使用享元模式可能会导致代码复杂化,降低可读性和可维护性。因此,在使用享元模式时应根据实际情况进行评估和折衷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Gradle 安装配置详解 26284
  • “无法连接到打印机。您输入的打印机名不正确 或者指定的打印机没有连接到服务器上”终极解决方法 21154
  • 解决安装Mysql失败:GPG密钥已安装,但是不适用于此软件包的问题 14876
  • GitBlit的使用教程 10354
  • linux 下安装安装rz/sz命令 10280

分类专栏

  • Java进阶代码示例 97篇
  • JAVA进阶笔记整理 28篇
  • 编程思想、设计模式、数据结构与算法 45篇
  • Linux环境搭建 6篇
  • 微服务技术 14篇
  • 企业级开发框架SSM 39篇
  • 分布式技术 15篇
  • idea的使用 3篇
  • JAVA单体架构项目案例介绍 25篇
  • javaweb 24篇
  • 数据库技术 20篇
  • JAVASE 4篇
  • vb 4篇
  • 网络技术 2篇

最新评论

  • GitBlit的使用教程

    NavSoft: 客户端和服务器是在一台电脑上吗,还是两台电脑

  • GitBlit的使用教程

    zhangxin_zx: 第(5)步,如果clone项目报错,报错内容:Unable to negotiate with 47.96.92.201 port 29418: no matching host key type found. Their offer: ssh-rsa,ssh-dss fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 可以添加相应配置,参考这篇博文 https://blog.csdn.net/qq_45530512/article/details/127051071

  • GitBlit的使用教程

    zoujun8666: 你需要登陆才会有,有个默认的账号和密码,即admin/admin

  • GitBlit的使用教程

    CLRENTTE: 你好,我想问一下配置后右上角没有头标,只有用户名和密码的输入框,也没有注册 用户名和密码是从哪来的啊,GitHub的好像也不行

  • Centos 7 安装 JDK-11.0.6

    youjizz_: 文件过期了

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • scratch3文件转exe文件方法
  • GitBlit的使用教程
  • Ribbon核⼼源码剖析
2023年1篇
2022年91篇
2021年230篇
2010年2篇
2009年1篇
2008年6篇
2007年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司南澳标王福永关键词按天扣费深圳阿里店铺运营布吉SEO按天收费深圳网站定制沙井如何制作网站大鹏网络营销广州网站设计模板福田关键词按天收费平湖百度seo盐田网站定制大运网络广告推广宝安网站开发吉祥关键词按天扣费爱联关键词排名坑梓网站优化推广罗湖网络营销福永网站优化按天扣费龙华外贸网站设计横岗百度爱采购平湖网站改版福永网站设计坪地建网站大鹏阿里店铺托管平湖营销型网站建设大浪SEO按天收费民治阿里店铺托管塘坑企业网站制作南联关键词排名深圳网站推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化