设计模式(11)--Flyweight(享元模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入!
1.模式定义:
2.模式特点:
3.使用场景:
4.模式实现:
(1)单纯享元模式

[1]抽象享元(Flyweight)角色 :
- public interface Flyweight {
- //一个示意性方法,参数state是外蕴状态
- public void operation(String state);
- }
[2]具体享元(ConcreteFlyweight)角色:
- public class ConcreteFlyweight implements Flyweight {
- private Character intrinsicState = null;
- /**
- * 构造函数,内蕴状态作为参数传入
- * @param state
- */
- public ConcreteFlyweight(Character state){
- this.intrinsicState = state;
- }
- /**
- * 外蕴状态作为参数传入方法中,改变方法的行为,
- * 但是并不改变对象的内蕴状态。
- */
- @Override
- public void operation(String state) {
- // TODO Auto-generated method stub
- System.out.println("Intrinsic State = " + this.intrinsicState);
- System.out.println("Extrinsic State = " + state);
- }
- }
[3]享元工厂(FlyweightFactory)角色 :
- public class FlyweightFactory {
- private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();
- public Flyweight factory(Character state){
- //先从缓存中查找对象
- Flyweight fly = files.get(state);
- if(fly == null){
- //如果对象不存在则创建一个新的Flyweight对象
- fly = new ConcreteFlyweight(state);
- //把这个新的Flyweight对象添加到缓存中
- files.put(state, fly);
- }
- return fly;
- }
- }
[4]客户端类
- public class Client {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- FlyweightFactory factory = new FlyweightFactory();
- Flyweight fly = factory.factory(new Character('a'));
- fly.operation("First Call");
- fly = factory.factory(new Character('b'));
- fly.operation("Second Call");
- fly = factory.factory(new Character('a'));
- fly.operation("Third Call");
- }
- }

(2)复合享元模式

[1]抽象享元(Flyweight)角色 :
- public interface Flyweight {
- //一个示意性方法,参数state是外蕴状态
- public void operation(String state);
- }
[2]具体享元(ConcreteFlyweight)角色:
- public class ConcreteFlyweight implements Flyweight {
- private Character intrinsicState = null;
- /**
- * 构造函数,内蕴状态作为参数传入
- * @param state
- */
- public ConcreteFlyweight(Character state){
- this.intrinsicState = state;
- }
- /**
- * 外蕴状态作为参数传入方法中,改变方法的行为,
- * 但是并不改变对象的内蕴状态。
- */
- @Override
- public void operation(String state) {
- // TODO Auto-generated method stub
- System.out.println("Intrinsic State = " + this.intrinsicState);
- System.out.println("Extrinsic State = " + state);
- }
- }
[3]复合享元(ConcreteCompositeFlyweight)角色 :
- public class ConcreteCompositeFlyweight implements Flyweight {
- private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();
- /**
- * 增加一个新的单纯享元对象到聚集中
- */
- public void add(Character key , Flyweight fly){
- files.put(key,fly);
- }
- /**
- * 外蕴状态作为参数传入到方法中
- */
- @Override
- public void operation(String state) {
- Flyweight fly = null;
- for(Object o : files.keySet()){
- fly = files.get(o);
- fly.operation(state);
- }
- }
- }
[4]享元工厂(FlyweightFactory)角色 :
- public class FlyweightFactory {
- private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();
- /**
- * 复合享元工厂方法
- */
- public Flyweight factory(List<Character> compositeState){
- ConcreteCompositeFlyweight compositeFly = new ConcreteCompositeFlyweight();
- for(Character state : compositeState){
- compositeFly.add(state,this.factory(state));
- }
- return compositeFly;
- }
- /**
- * 单纯享元工厂方法
- */
- public Flyweight factory(Character state){
- //先从缓存中查找对象
- Flyweight fly = files.get(state);
- if(fly == null){
- //如果对象不存在则创建一个新的Flyweight对象
- fly = new ConcreteFlyweight(state);
- //把这个新的Flyweight对象添加到缓存中
- files.put(state, fly);
- }
- return fly;
- }
- }
[5]客户端角色
- public class Client {
- public static void main(String[] args) {
- List<Character> compositeState = new ArrayList<Character>();
- compositeState.add('a');
- compositeState.add('b');
- compositeState.add('c');
- compositeState.add('a');
- compositeState.add('b');
- FlyweightFactory flyFactory = new FlyweightFactory();
- Flyweight compositeFly1 = flyFactory.factory(compositeState);
- Flyweight compositeFly2 = flyFactory.factory(compositeState);
- compositeFly1.operation("Composite Call");
- System.out.println("---------------------------------");
- System.out.println("复合享元模式是否可以共享对象:" + (compositeFly1 == compositeFly2));
- Character state = 'a';
- Flyweight fly1 = flyFactory.factory(state);
- Flyweight fly2 = flyFactory.factory(state);
- System.out.println("单纯享元模式是否可以共享对象:" + (fly1 == fly2));
- }
- }

5.优缺点:
(1)享元模式优点
(2)享元模式缺点
6.模式深入讲解
(1)变与不变
(2)共享与不共享
(3)实例池
7.应用实例
(1)Java中的String类型
- public class Test {
- public static void main(String[] args) {
- String a = "abc";
- String b = "abc";
- System.out.println(a==b);
- }
- }
设计模式(11)--Flyweight(享元模式)--结构型的更多相关文章
- Flyweight享元模式(结构型模式)
1.面向对象的缺点 虽然OOP能很好的解决系统抽象的问题,并且在大多数的情况下,也不会损失系统的性能.但是在某些特殊的业务下,由于对象的数量太多,采用面向对象会给系统带来难以承受的内存开销.示例代码如 ...
- 设计模式(十二): Flyweight享元模式 -- 结构型模式
说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...
- 设计模式之flyweight享元模式
运用共享技术支持大量细粒度对象的使用 Flyweight模式(享元) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模 ...
- Flyweight 享元(结构型)
一:描述:(该模式实际应用较少) Flyweight 享元模式是对大量细粒度的元素进行共享和重用.减少对象的创建减轻内存: 注和单例模式不同的是:享元模式的各个对象佣有各自的行为并可实例化,单例模式的 ...
- 面向对象设计模式之Flyweight享元模式(结构型)
动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...
- Java设计模式:Flyweight(享元)模式
概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...
- go语言设计模式之Flyweight(享元模式)
flyweight.go package flyweight import ( "time" ) const ( TEAM_A = "A" TEAB_B = & ...
- 设计模式11: Flyweight 享元模式(结构型模式)
Flyweight 享元模式(结构型模式) 面向对象的代价 面向对象很好的解决了系统抽象性的问题,同时在大多数情况下也不会损及系统的性能.但是,在某些特殊应用中,由于对象的数量太大,采用面向对象会给系 ...
- 第11章 享元模式(Flyweight Pattern)
原文 第11章 享元模式(Flyweight Pattern) 概述: 面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时 ...
随机推荐
- Flask 初印象
Flask 出生于2010年,集中了其他python web框架的长处,定位于微小项目上. 特点 1 内置开发服务器和调试器 2 于Python单元测试功能无缝衔接 Flask框架提供了一个与Pyth ...
- redis哨兵集群环境搭建
一.哨兵的介绍 哨兵(sentinal)是redis集群架构中非常重要的一个组件,主要功能如下: 集群监控,负责监控redis master和slave进程是否正常工作 消息通知,如果某个redis实 ...
- javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)
javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...
- 剑指offer三从头到尾打印链表
一.题目: 输入一个链表,从尾到头打印链表每个节点的值. 二.解题方法: 方法一:采用递归的方式实现 方法二:借助堆栈的“后进先出”实现 import java.util.ArrayList; imp ...
- One-hot数据处理
机器学习 数据预处理之独热编码(One-Hot Encoding)(转) 问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male&q ...
- Linux机器之间复制文件和目录方式&Linux的scp命令详解
本文转载于:http://www.cnblogs.com/hitwtx/archive/2011/11/16/2251254.html 整理总结如下: 不同的Linux之间copy文件常用有3种方法: ...
- Java模式—简单工厂模式
简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式. 目的:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. ...
- FineBI学习系列之FineBI的Windows里安装步骤(图文详解)
不多说,直接上干货! 先进入FineBI官网. http://www.finebi.com/product/download/ windows系统里FineBI的安装流程 1.从FineBI官网下载 ...
- Attr类中进行类型推断
涉及到重要的类的继承关系如下图所示. 关于抛出的异常继承体系:
- ThreadPoolExecutor策略配置以及应用场景
ThreadPoolExecutor 是用来处理异步任务的一个接口,可以将其理解成为一个线程池和一个任务队列,提交到 ExecutorService 对象的任务会被放入任务队或者直接被线程池中的线程执 ...