当前位置: 首页 > news >正文

瑶海区网站建设seo技术教学视频

瑶海区网站建设,seo技术教学视频,网站制作软件都是什么,合肥知名建站公司定义享元模式是对象的结构模式,享元模式以共享的方式高效的支持大量的细粒度对象,主要用于减少创建对象的数量,以减少内存占用和提高性能享元对象能做到共享的关键在于区分了内蕴状态和外蕴状态内蕴状态是存储在享元对象内部的,并…

定义

享元模式是对象的结构模式,享元模式以共享的方式高效的支持大量的细粒度对象,主要用于减少创建对象的数量,以减少内存占用和提高性能

享元对象能做到共享的关键在于区分了内蕴状态和外蕴状态

内蕴状态是存储在享元对象内部的,并且是不会随环境的改变而有所不同,因此,一个享元对象可以具有内蕴状态并且可以共享

外蕴状态是随着环境的改变而改变的,并且是不可以共享的状态,享元对象的外蕴状态必须是由客户端保存,并且是在享元对象创建之后,在需要使用的时候再传到享元对象内部

外蕴状态不可以影响享元对象的内蕴状态,换句话说,它们是相互独立的

意图

运用共享技术有效地支持大量细粒度的对象

主要解决问题

在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建

何时使用

系统中存在大量的对象,并且消耗了大量的内存,这些对象的状态大部分可以外部化,这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替

优缺点

优点:

大大减少对象的创建,降低系统的内存,使效率提高

缺点:

使得系统更加复杂,为了使对象可以共享,需要将一些状态外部化

结构

6058d02544e787294fb572a9b3065a76.png

涉及的角色:

抽象享元(Flyweight)角色:所有具体享元类的超类,为这些类规定需要实现的接口

具体享元(ConcreteFlyweight)角色:实现抽象享元角色规定的接口,如果有内蕴状态的话,必须为内蕴状态提供存储空间,享元对象的内蕴状态必须与所处的环境无关,从而使得享元对象可以在系统中共存

享元(FlyweightFactory)工厂角色:负责创建和管理享元角色,本角色必须保证享元对象可以被系统适当的共享,当客户端调用享元对象的时候,享元工厂会检查系统中是不是已经有了符合要求的享元对象,如果有了就提供这个对象,如果没有享元工厂就应当创建一个合适的享元对象

客户端(Client)角色:本角色需要维护一个对所有享元对象的引用,需要自行存储所有享元对象的外蕴状态

对应源码如下:

public abstract class Flyweight{

/** 一个示意性的方法,参数state是外蕴状态 */

public abstract void operation(String state);

}

复制代码

public class ConcreteFlyweight extends Flyweight{

private int intrinsicState;

public ConcreteFlyweight(int intrinsicState){

this.intrinsicState = intrinsicState;

}

/**

* 外蕴状态作为参量传入

* 改变方法的行为

* 并不改变对象的内蕴状态

*/

@Override

public void operation(String state){

System.out.println("内蕴状态:" + intrinsicState + ",,外蕴状态:" + state);

}

}

复制代码

public class FlyweightFactory{

private Map map = new HashMap();

private Flyweight flyweight;

public FlyweightFactory(){

}

//内蕴状态作为参量传入

public Flyweight factory(int state){

if (map.containsKey(state)) {

return map.get(state);

} else {

Flyweight fly = new ConcreteFlyweight(state);

map.put(String.valueOf(state), fly);

return fly;

}

}

public void checkFlyweight(){

Flyweight fly;

int i = 0;

Iterator iterator = map.entrySet().iterator();

while (iterator.hasNext()) {

Map.Entry e = (Map.Entry) iterator.next();

System.out.println("Item " + (++i) + ":" + e.getKey());

}

}

}

复制代码

public class Client{

public static void main(String[] args){

FlyweightFactory factory = new FlyweightFactory();

Flyweight flyweight = factory.factory(888);

flyweight.operation("第一次");

flyweight = factory.factory(999);

flyweight.operation("第二次");

flyweight = factory.factory(888);

flyweight.operation("第三次");

System.out.println();

factory.checkFlyweight();

}

}

复制代码

b7bdb53d217f9acd1ab0c75a4ad58045.png

奶茶摊位的例子

在这个奶茶摊位上,有一系列口味的奶茶,客人来了之后拿到奶茶付了钱就走了,奶茶有内蕴状态,也就是它的口味,没有外部环境影响,也就是没有外蕴状态

如果在系统中,对每一杯奶茶都创建一个对象的话,那么就会创建出很多细小的对象出来,如果按照奶茶的口味区分,每一种口味的奶茶都只创建一个对象,然后共享

下面使用代码实现:

抽象享元角色,也就是每一种奶茶口味需要实现的接口:

public abstract class Order{

/** 将咖啡卖给客人 */

public abstract void sellingCoffee();

/** 返回奶茶的口味 */

public abstract String getFlavor();

}

复制代码

具体享元角色,奶茶口味实现抽象享元角色提供的接口:

public class Flavor extends Order{

private String flavor;

public Flavor(String flavor){

this.flavor = flavor;

}

@Override

public void sellingCoffee(){

System.out.println("将奶茶卖给客人,奶茶口味为:" + this.flavor);

}

@Override

public String getFlavor(){

return this.flavor;

}

}

复制代码

摊主提供奶茶,也就是享元工厂,负责创建和管理享元角色:

public class FlavorFactory{

private Order[] flavors = new Flavor[10];

private int ordersMade = 0;

private int totalFlavors = 0;

/** 根据所需要的口味提供奶茶 */

public Order getOrder(String flavor){

if (ordersMade > 0) {

for (int i=0; i

if (flavor.equals(flavors[i].getFlavor())) {

return flavors[i];

}

}

}

flavors[ordersMade] = new Flavor(flavor);

totalFlavors++;

return flavors[ordersMade++];

}

/** 返回所有的奶茶口味 */

public int getTotalFlavors(){

return totalFlavors;

}

}

复制代码

客户端:

public class Client{

private static Order[] flavors = new Flavor[10];

private static int ordersMade = 0;

private static FlavorFactory factory;

private static void taskOrder(String flavor){

flavors[ordersMade++] = factory.getOrder(flavor);

}

public static void main(String[] args){

factory = new FlavorFactory();

taskOrder("原味");

taskOrder("香蕉");

taskOrder("原味");

taskOrder("草莓");

taskOrder("草莓");

for (int i=0; i

flavors[i].sellingCoffee();

}

System.out.println("总共买奶茶人数:" + ordersMade);

System.out.println("总共卖出奶茶口味数:" + factory.getTotalFlavors());

}

}

复制代码

3cb13ccd3bde8086d8ed7cb4e9de4f25.png

可以看到,虽然客人买了5杯奶茶,但是奶茶的口味只有三种

奶茶店的例子

奶茶摊位没有提供桌椅给客人,也就是没有外部环境影响,现在奶茶店提供了桌椅,那么桌椅就是外蕴状态

抽象享元角色,也就是每一种奶茶口味需要实现的接口:

public abstract class Order{

/** 将咖啡卖给客人 */

public abstract void sellingCoffee(Table table);

/** 返回奶茶的口味 */

public abstract String getFlavor();

}

复制代码

具体享元角色,奶茶口味实现抽象享元角色提供的接口:

public class Flavor extends Order{

private String flavor;

public Flavor(String flavor){

this.flavor = flavor;

}

@Override

public void sellingCoffee(Table table){

System.out.println("将奶茶卖给客人,奶茶口味为:" + this.flavor + ",客人所坐桌子号码为:" + table.getNumber());

}

@Override

public String getFlavor(){

return this.flavor;

}

}

复制代码

奶茶店提供奶茶,也就是享元工厂,负责创建和管理享元角色:

public class FlavorFactory{

private Order[] flavors = new Flavor[10];

private int ordersMade = 0;

private int totalFlavors = 0;

/** 根据所需要的口味提供奶茶 */

public Order getOrder(String flavor){

if (ordersMade > 0) {

for (int i=0; i

if (flavor.equals(flavors[i].getFlavor())) {

return flavors[i];

}

}

}

flavors[ordersMade] = new Flavor(flavor);

totalFlavors++;

return flavors[ordersMade++];

}

/** 返回所有的奶茶口味 */

public int getTotalFlavors(){

return totalFlavors;

}

}

复制代码

环境角色,桌椅:

public class Table{

/** 桌子号码 */

private int number;

public Table(int number){

this.number = number;

}

public int getNumber(){

return number;

}

public void setNumber(int number){

this.number = number;

}

}

复制代码

客户端:

public class Client{

private static Order[] flavors = new Flavor[10];

private static int ordersMade = 0;

private static FlavorFactory factory;

private static void taskOrder(String flavor){

flavors[ordersMade++] = factory.getOrder(flavor);

}

public static void main(String[] args){

factory = new FlavorFactory();

taskOrder("原味");

taskOrder("香蕉");

taskOrder("原味");

taskOrder("草莓");

taskOrder("草莓");

for (int i=0; i

flavors[i].sellingCoffee(new Table(i+1));

}

System.out.println("总共买奶茶人数:" + ordersMade);

System.out.println("总共卖出奶茶口味数:" + factory.getTotalFlavors());

}

}

复制代码

0e7b55e6f303679c4ee9e34d0222edc9.png

在什么情况下使用享元模式

一个系统中有大量的对象

这些对象消耗大量的内存

这些对象的状态中大部分都可以外部化

这些对象可以按照内蕴状态分为很多组,当把外蕴状态从对象中剔除时,每一个组都可以用一个对象代替

软件系统不依赖这些对象的身份,即这些对象可以是不可分辨的

http://www.lbrq.cn/news/2402911.html

相关文章:

  • 湘潭公司网站建设网盟推广
  • 陕西网站建设推广深圳seo推广公司
  • 晋城做网站公司怎样做推广更有效
  • 迅睿cms和帝国哪个好福州网seo
  • 牛股大转盘网站建设seo怎么做优化工作
  • 网站上的图片带店面是怎么做的百度搜索简洁版网址
  • 网站建设与运营的实训总结站长工具友链检测
  • 阿里云网站用什么做的大连网络推广
  • 烟台哪家公司可以做网站网站友情链接检测
  • 利鑫做彩票网站推广软件赚钱的平台
  • b2c网站建设方案免费的seo
  • WordPress抓去微信seo网站优化推广怎么样
  • nft制作网站网络推广教程
  • 南宁网站开发建设百度最新收录方法
  • 建设网站 无法显示图片百度竞价网站
  • 网站头部怎么做找培训班一般在什么平台
  • 网站做友链有什么用seo分析网站
  • 军事最新消息中国关键词优化公司费用多少
  • 有什么做宝宝辅食的网站吗网络营销管理名词解释
  • 国外购物平台seo收费
  • 唐山正规做网站的公司搜索引擎优化seo网站
  • 企业网站优化哪家好公司网站域名续费一年多少钱
  • 如何通过外链提高网站权重如何做好一个营销方案
  • 网站建设费怎么写会计科目中国搜索引擎份额排行
  • 网站制作主题seo搜索引擎优化实训报告
  • 安徽建设教育协会网站seo狂人
  • 网站做框架常州百度搜索优化
  • e通网网站建设运营商大数据精准营销获客
  • 上海最近三天的新闻百度seo关键词点击软件
  • sem可以为网站建设做什么网络seo哈尔滨
  • 前端静态资源免费cdn服务推荐
  • 在C++里如何避免栈内存溢出
  • week4
  • [硬件电路-57]:根据电子元器件的受控程度,可以把电子元器件分为:不受控、半受控、完全受控三种大类
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘sqlalchemy’问题
  • Patch-wise Structural:一种引入局部统计特性的时序预测损失函数