北风设计模式课程---享元模式与单例模式区别

一、总结

一句话总结:

不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例

1、享元模式与单例模式区别?

级别:单例模式是类级别的,一个类只能有一个对象实例;享元模式是对象级别的,可以有多个对象实例,多个变量引用同一个对象实例;
对象个数:享元模式可以再次创建对象 也可以取缓存对象,单例模式则是严格控制单个进程中只有一个实例对象

2、享元模式与单例模式的共同点?

实现节省对象创建的时间
节约内存资源

二、享元模式与单例模式区别

转自或参考:享元模式与单例模式区别
https://blog.csdn.net/fanchengkai1218/article/details/51840612

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanchengkai1218/article/details/51840612

单例模式是类级别的,一个类只能有一个对象实例;

享元模式是对象级别的,可以有多个对象实例,多个变量引用同一个对象实例;

享元模式主要是为了节约内存空间,提高系统性能,而单例模式主要为了可以共享数据;

1:单例模式

public class Singleton {
// 我来写一个单例模式 懒汉式
private static Singleton singleton;
private Singleton(){}

public static synchronized Singleton getSingleton(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
public static void main(String[] args) {
Singleton instance1 = Singleton.getSingleton();
Singleton instance2 = Singleton.getSingleton();
System.out.println(instance1==instance2);
}
}

2:享元模式

//享元模式是多个变量公用一个对象实例 大大节约了内存空间 提高了系统性能 String类是final类型 就是使用了享元模式
//数据库连接池 线程池也是享元模式的应用
public abstract class Flyweight {
// 享元模式 享元抽象类
public abstract void operation();
}

//具体类 享元实现类
public class CreateFlyweight extends Flyweight {

private String str;

public CreateFlyweight(String str) {
this.str = str;
}

@Override
public void operation() {
// TODO Auto-generated method stub
System.out.println("Create---Flyweight:" + str);
}

public static void main(String[] args) {
Flyweight flyweight = new CreateFlyweight("fanck");
flyweight.operation();
}

}

//工厂方法类 维护一个对象存储池 享元工厂类
public class FlyweightFactory {
private Hashtable flyweights = new Hashtable();

public FlyweightFactory() {
};

public Flyweight getFlyweight(Object obj) {
Flyweight flyweight = (Flyweight) flyweights.get(obj);
if (flyweight == null) {
flyweight = new CreateFlyweight((String) obj);
flyweights.put(obj, flyweight);
}
return flyweight;
}

public int getFlyweightSize() {
System.out.println("flyweights:"+flyweights);
return flyweights.size();
}

public static void main(String[] args) {
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight fly1 = flyweightFactory.getFlyweight("abc");
Flyweight fly2 = flyweightFactory.getFlyweight("b");
Flyweight fly3 = flyweightFactory.getFlyweight("abc");
Flyweight fly4 = flyweightFactory.getFlyweight("ef");
Flyweight fly5 = flyweightFactory.getFlyweight("ef");
Flyweight fly6 = flyweightFactory.getFlyweight("ef");
fly1.operation();
fly2.operation();
fly3.operation();
fly4.operation();
fly5.operation();
fly6.operation();
System.out.println(flyweightFactory.getFlyweightSize());
}
}

享元模式可以再次创建对象 也可以取缓存对象

单例模式则是严格控制单个进程中只有一个实例对象

享元模式可以通过自己实现对外部的单例 也可以在需要的使用创建更多的对象

单例模式是自身控制 需要增加不属于该对象本身的逻辑

两者都可以实现节省对象创建的时间 ThreadPool 线程池 与数据库连接池 都有使用享元模式

转载于:https://www.cnblogs.com/Renyi-Fan/p/11029076.html

北风设计模式课程---享元模式与单例模式区别相关推荐

  1. 北风设计模式课程---享元模式

    北风设计模式课程---享元模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式的本质是什么? 池技术:各种缓存池都是享元模式的体现 说到享元模 ...

  2. Python设计模式:享元模式和单例模式

    设计模式八:享元模式和单例模式 什么是享元模式 享元模式是一个用于优化的设计模式,通过为相似对象引入数据共存来最小化内存使用,提升性能. 一个享元就是一个包含状态独立的不可变数据的对象,依赖状态的可变 ...

  3. 【设计模式】享元模式 简介 ( 定义 | 对象池 | 内部状态 | 外部状态 | 适用场景 | 相关角色 )

    文章目录 I . 享元模式 简介 II . 享元模式 内部状态 和 外部状态 III . 享元模式 适用场景 IV . 享元模式 优缺点 V . 享元模式 相关模式 VI . 享元模式 相关角色 I ...

  4. 详解设计模式:享元模式

    享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能.它提供了 ...

  5. 设计模式之享元模式详解

    设计模式之享元模式详解 概述 享元模式定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用.它==通过共享已经存在的对象来大幅度减少需要创建的对象数量==.避免大量相似对象的开销,从而提高系统资源 ...

  6. 【设计模式】享元模式(C#)

    [设计模式]享元模式 1.概述 Flyweight Design Pattern,结构型模式.享元模式中的"享元"指被共享的单元.享元模式通过复用对象,以达到节省内存的目的. 用于 ...

  7. 设计模式之享元模式学习笔记

    前言 享元模式是池技术(String常量池.数据库连接池.缓冲池等)的重要实现方式,可以减少应用程序创建对象,降低程序内存的占用,提高性能. 定义 使用共享对象,有效的大量细粒度的对象 结构图 角色拆 ...

  8. 每天一个设计模式之享元模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  9. .net设计模式 (享元模式)学习笔记

    运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题  合理应用扬长避短 结构性设计模式:关注的是类与类之间的关系 .net设计模式 (享元模式)学习笔记 ...

最新文章

  1. Linux系统下的DDOS***防范
  2. java中GET方式提交和POST方式提交
  3. 大神微服务笔记全过程博客
  4. Flutter游戏:启动时的欢迎页
  5. 给java虚拟机增加一个属性,java -D
  6. ASCII码对照表(Python代码实现打印,python-docx库/xlwt库/fpdf库)
  7. vue2 配置本地IP地址访问项目
  8. Webots水下机器人仿真
  9. EMLOG模板山河网站主题分享
  10. 菜刀,蚁剑,冰蝎,哥斯拉的流量特征
  11. 评论回复功能 asp.net_LR2021颜色分级功能让照片调色简单有趣好玩!最新尝鲜测试...
  12. 毒蘑菇导航,感觉不像是毒蘑菇,更像是个树莓了。
  13. 关于MC34063的奇怪问题参考解决方案(mc34063升压失败、输出等于输入,输出电压低于输入)
  14. 神经风格转移:Anaconda快速搭建DL框架学梵高(Van Gogh)绘画Ubuntu16.04 CPUGPU版
  15. 各类文件系统镜像制作
  16. 导航坐标系:地心惯性坐标系、地心地固坐标系、当地水平坐标系、载体/机体坐标系
  17. 以太坊合约语言开发简单介绍
  18. 《小学生四则运算出题软件》结对项目总结
  19. php 银行支付通道_接口--php对接农行网上支付平台-b2b
  20. android zuk彩蛋,联想ZUK Z2你真的会玩吗?来看U-Touch 2.0的那些小彩蛋

热门文章

  1. rm ,rm -rf , rm -f,rm -r 以及rm 命令的其他参数命令
  2. Android音频开发(五)如何存储和解析最简单的音频wav文件
  3. java实验多线程机制_JAVA 多线程机制(一)
  4. python怎样画动态文字_Python制作动态字符图的实例
  5. fullcalendar next 不变化_让不懂编程的人爱上iPhone开发(2017秋iOS11+Swift4+Xcode9版)-第3篇...
  6. 【kafka】kafka log 存储时间 小于 offset 存储时间 offset存在但是消费不到
  7. 【Flink】Flink 写入 AnalyticDB MySQL
  8. 60-400-040-使用-binlog-MySQL BinLog入门
  9. 【Spring】No suitable HttpMessageConverter repsonse type
  10. 【Java】Java 集合相关的博客积累