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

Flyweight模式(享元)

Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的
中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Flyweight(享元模式)模式是比较常用的一个模式。

Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中.

定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。
  
设计初衷:面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几
千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是
取决于应用(context),是不可共享的.

在此 以咖啡外卖店为例
写了4个java类来描述说明Flyweight设计模式的实现方式;
  
客户买咖啡下订单,订单只区分咖啡口味,如果下了1W个订单,而咖啡店只卖20种口味的咖啡,那么我们就没有必要生成1W个订单对象,通过享元模式我们只需要生成20个订单对象。

这个例子举的不太好,但足以说明问题。下面是具体的代码。

1、
Order.java        
订单抽象类
  2、
FlavorOrder.java   订单实现类
  3、
FlavorFactory.java 订单生成工厂
  4、
Client.java       
客户类、带有main方法的测试类

===============   1、
Order.java
package flyweight;

public abstract class Order {
  //执行卖出动作
  public abstract void sell();
  //获取咖啡口味
  public abstract String getFlavor();
}
===============  
1   end

===============   2、
FlavorOrder.java
package flyweight;

public class FlavorOrder extends Order{ 
  private String flavor;
 
  public FlavorOrder(String flavor){
     
this.flavor = flavor;
  }
 
  public String getFlavor(){
     
return this.flavor;
  }

public void sell(){
     
System.out.println("卖出一杯 [" + flavor + "]。" );
  }
}
===============  
2   end

===============   3、
FlavorFactory.java
package flyweight;

import java.util.HashMap;
import java.util.Map;

public class FlavorFactory {
  //订单池
  private
Map<String,Order> flavorPool = new
HashMap<String,Order>(20);

//静态工厂,负责生成订单对象
  private static FlavorFactory flavorFactory = new
FlavorFactory();

private FlavorFactory() {}

public static FlavorFactory getInstance()
{
    return
flavorFactory;
  }

//获得订单
  public Order getOrder(String flavor) {
    Order order
= null;
   
if(flavorPool.containsKey(flavor)){
     
order = flavorPool.get(flavor);
    }else{
     
//获得新口味订单
     
order = new FlavorOrder(flavor);
     
//放入对象池
     
flavorPool.put(flavor,
order);   
    }
    return
order;
  }

//获得已经卖出的咖啡全部口味数量
  public int getTotalFlavorsMade() {
    return
flavorPool.size();
  }
}
===============  
3   end

===============   4、
Client.java
package flyweight;

import java.util.ArrayList;
import java.util.List;

public class Client {
  //客户下的订单
  private static
List<Order> orders = new
ArrayList<Order>(100);

//订单对象生成工厂
  private static FlavorFactory flavorFactory;

//增加订单
  private static void takeOrders(String flavor)
{
   
orders.add(flavorFactory.getOrder(flavor));
  }

public static void main(String[] args)
{
   
//订单生成工厂
   
flavorFactory = FlavorFactory.getInstance();

//增加订单
   
takeOrders("摩卡");
   
takeOrders("卡布奇诺");
   
takeOrders("香草星冰乐");
   
takeOrders("香草星冰乐");
   
takeOrders("拿铁");
   
takeOrders("卡布奇诺");
   
takeOrders("拿铁");
   
takeOrders("卡布奇诺");
   
takeOrders("摩卡");
   
takeOrders("香草星冰乐");
   
takeOrders("卡布奇诺");
   
takeOrders("摩卡");
   
takeOrders("香草星冰乐");
   
takeOrders("拿铁");
   
takeOrders("拿铁");

//卖咖啡
    for(Order
order : orders){
     
order.sell();
    }

//打印生成的订单java对象数量
   
System.out.println("n客户一共买了 " +  orders.size() +
" 杯咖啡! ");

//打印生成的订单java对象数量
   
System.out.println("n共生成了 " + 
flavorFactory.getTotalFlavorsMade() + " 个 FlavorOrder java对象!
");
  }
}
===============  
4   end

设计模式之flyweight享元模式的更多相关文章

  1. 面向对象设计模式之Flyweight享元模式(结构型)

    动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...

  2. 设计模式(11)--Flyweight(享元模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ...

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

    概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...

  4. go语言设计模式之Flyweight(享元模式)

    flyweight.go package flyweight import ( "time" ) const ( TEAM_A = "A" TEAB_B = & ...

  5. 设计模式11: Flyweight 享元模式(结构型模式)

    Flyweight 享元模式(结构型模式) 面向对象的代价 面向对象很好的解决了系统抽象性的问题,同时在大多数情况下也不会损及系统的性能.但是,在某些特殊应用中,由于对象的数量太大,采用面向对象会给系 ...

  6. C++设计模式-Flyweight享元模式

    Flyweight享元模式 作用:运用共享技术有效地支持大量细粒度的对象. 内部状态intrinsic和外部状态extrinsic: 1)Flyweight模式中,最重要的是将对象分解成intrins ...

  7. 20、FlyWeight 享元模式

    池化的思想 1.Flyweight享元模式 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用.由于享元模式要求能够共享的对象必 ...

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

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...

  9. Flyweight享元模式(结构型模式)

    1.面向对象的缺点 虽然OOP能很好的解决系统抽象的问题,并且在大多数的情况下,也不会损失系统的性能.但是在某些特殊的业务下,由于对象的数量太多,采用面向对象会给系统带来难以承受的内存开销.示例代码如 ...

随机推荐

  1. Tomcat 支持的Java 版本和兼容性总结

    https://tomcat.apache.org/whichversion.html 最新最全的Tomcat 支持的Java版本对照,即兼容性一览表:   Servlet Spec JSP Spec ...

  2. uva-10152-乌龟排序

    求从待排序的到期望的顺序的最小操作顺序,只能进行一个操作,将当前的乌龟拿出来,上面的下移,拿出来的放到最上面 发现voj没有PE, 解题方法,把俩个串反过来使用,从期望的顺序到待排序的顺序. AC:1 ...

  3. leetcode171

    public class Solution { private int ConvertToC(char c) { ; switch (c) { case 'A': case 'a': rnt = ; ...

  4. Maven的几个常用plugin

    出自:https://www.cnblogs.com/zhangxh20/p/6298062.html maven-compiler-plugin 编译Java源码,一般只需设置编译的jdk版本 &l ...

  5. Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...

  6. 吴裕雄 python神经网络 水果图片识别(2)

    import osimport numpy as npimport matplotlib.pyplot as pltfrom skimage import color,data,transform,i ...

  7. Gson转换时,Double转式化

    package com.mall.core; import java.lang.reflect.Type; import java.text.DecimalFormat; import com.goo ...

  8. Scrapy简单入门及实例讲解-转载

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

  9. Centos7 創建快捷方式

    usr/share/applications 創建文件 Gogland.desktop [Desktop Entry]Version=1Type=ApplicationName=GoglandGene ...

  10. IntelliJ IDEA SVN

    第一步:下载svn的客户端,通俗一点来说就是小乌龟啦!去电脑管理的软件管理里面可以直接下载,方便迅速 下载之后直接安装就好了,但是要注意这里的这个文件也要安装上,默认是不安装的,如果不安装,svn中的 ...