首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何构建创造性设计模式:例模式

例设计模式是一种软件设计模式,它将类的实例化限制为一个对象。与其他创造性设计模式(如抽象工厂)相比,例构建器模式将创建一个对象,并且还将负责只存在该对象的一个实例。...当创建一个例类,有一些问题需要记住: 如何确保一个类只有一个实例? 如何方便地访问类的惟一实例? 类如何控制实例化? 如何限制类的实例数量?...让我们假设一个场景:Messenger类打开一个tcp连接(例如,XMPP),并且为了发送消息,必须保持连接的存在。每次必须发送消息打开新的XMPP连接会非常低效。...静态变量是类级变量,其中内存分配只类被加载到内存中发生一次。在此过程中,我们确保Messenger类将只实例化一次。getInstance方法将在调用静态messenger实例获取它。...解决方案是getInstance方法实例化Messenger类。

74740

Java例模式的写法及优缺点

; 缺点:线程不安全,多线程下,可能会创建多个实例(一定要重视这个问题,有时候如果在例对象的构造方法中做了某些重要操作,创建多个实例可能会造成可怕后果,如:打开Android的Sqlite数据库连接...DCL优点是资源利用率高,第一次执行getInstance例对象才被实例化,效率高。缺点是第一次加载反应稍慢一些,高并发环境下也有一定的缺陷,虽然发生的概率很小。...,只有第一次调用getInstance方法虚拟机加载SingletonHolder 并初始化例 ,这样不仅能确保线程安全也能保证Singleton类实例的唯一性,所以推荐使用静态内部类例模式。...总结 上述讲的其他几种例模式实现中,有一种情况下他们会重新创建对象,那就是反序列化,将一个实例对象写到磁盘再读回来,从而获得了一个实例。...在上述的几个方法示例中如果要杜绝例对象被反序列化是重新生成对象,就必须加入如下方法: private Object readResolve() throws ObjectStreamException

74420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一起学习设计模式--01.例模式

    2.例模式的3个要点 某个类只能有一个实例必须自行创建这个实例必须自行向整个系统提供这个实例 3.结构图 从上图可以看出,例类模式结构图中只包含一个例角色。...三、负载均衡器的设计 1.需求 A科技公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理...懒汉式第一次调用GetInstance()方法实例化,类加载并不自行实例化,这种技术又称为延迟加载(lazy Load)技术,即需要的时候再加载实例。...饿汉式例类:类被加载就将自己实例化。...好处: 无需考虑多线程的访问问题,可以确保实例的唯一性。 由于例对象一开始就被创建好了,所以调用速度上和反应时间无需等待,这点要优于懒汉式。

    53510

    那些年,我们一起写过的“例模式”

    通常说来,适合使用例模式的机会也并不会太多,如果你的某个工程中出现了太多例,你就应该重新审视一下你的设计,详细确认一下这些场景是否真的都必须要控制实例的个数。...,但第一次调用时的初始化工作会导致性能延迟,以后每次获取实例也都要先判断实例是否被初始化,造成些许效率损失。...2) 因为例的实例是使用的静态变量,所有的派生类事实是共享同一个实例变量的,这种情况下要想让子类们维护正确的状态,顺利工作,基类就不得不实现注册表(Registry)功能了。...4) 此时再打开我们的 App,系统会重新创建一个 Application 对象,并恢复到刚刚离开的页面,即跳转到 Activity B。...2) 重写 onSaveInstanceState() 以及 onRestoreInstanceState() 方法,确保进程被杀掉保存了必须的应用状态,从而在重新打开可以正确恢复现场。

    1.4K40

    那些年,我们一起写的例模式

    通常说来,适合使用例模式的机会也并不会太多,如果你的某个工程中出现了太多例,你就应该重新审视一下你的设计,详细确认一下这些场景是否真的都必须要控制实例的个数。...,但第一次调用时的初始化工作会导致性能延迟,以后每次获取实例也都要先判断实例是否被初始化,造成些许效率损失。...2) 因为例的实例是使用的静态变量,所有的派生类事实是共享同一个实例变量的,这种情况下要想让子类们维护正确的状态,顺利工作,基类就不得不实现注册表(Registry)功能了。...4) 此时再打开我们的 App,系统会重新创建一个 Application 对象,并恢复到刚刚离开的页面,即跳转到 Activity B。...2) 重写 onSaveInstanceState() 以及 onRestoreInstanceState() 方法,确保进程被杀掉保存了必须的应用状态,从而在重新打开可以正确恢复现场。

    54930

    孔乙己的疑问:例模式有几种写法

    上面三种写法本质其实是一样的,也是各类文章介绍饿汉式时常用的方式。但使用静态final的实例对象或者使用静态代码块依旧不能解决反序列化、反射、克隆重新生成实例对象的问题。...当例对象有必要实现 Serializable 接口,即使将其构造函数设为私有,它反序列化时依然会通过特殊的途径再创建类的一个新的实例,相当于调用了该类的构造函数有效地获得了一个新实例!...因此当我们的例对象实现了 Cloneable 接口,尽管其构造函数是私有的,仍可以通过克隆来创建一个新对象,例模式也相应失效了。 优点:写法比较简单,类装载的时候就完成实例化。...JVM 类初始化阶段会获取一个锁,这个锁可以同步多个线程对同一个类的初始化 优点:避免了线程不安全,延迟加载,效率高。 缺点:依旧不能解决反序列化、反射、克隆重新生成实例对象的问题。...重写onSaveInstanceState()以及onRestoreInstanceState()方法,确保进程被杀掉保存了必须的应用状态,从而在重新打开可以正确恢复现场。

    66630

    设计模式-例模式

    windows的Recycle Bin(回收站)也是典型的例应用。整个系统运行过程中,回收站一直维护着仅有的一个实例。 网站的计数器,通常采用例模式实现,否则难以同步。...应用程序的日志应用,一般都何用例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。...数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率的损耗还是非常昂贵的,因为何用例模式来维护,就可以大大降低这种损耗。 工具类对象。...基本实现思路 例模式要求类永远只返回一个对象引用和一个获得该实例的方法(必须是静态方法,通常使用 getInstance 这个名称)。...静态内部类实现了懒加载,当Singleton加载并不立即实例化 INSTANCE。

    40530

    剑指Offer(一)--手写例模式

    饿汉模式(类加载的时候就已经创建,可以理解为饿汉已经饿得饥渴难耐,肯定先把资源紧紧拽自己手中,所以类加载的时候就会先创建实例,之后都会用同一个实例) 使用到的关键字: 例:singleton 实例...举个例子:我们的windows系统,那些应用比如网易云音乐客户端,点击打开,是一个界面,我们把这个窗口最小化,再次点击客户端打开,我们发现它还是原来打开的界面,不会重新创建一个界面。...这里面就是不想浪费系统资源,利用了例模式的思想。如果还没有打开过,就创建一个新的界面(其实是一个进程)显示,如果已经打开了,就会使用之前的,不会重新打开一个相同的。 3.例模式有什么优缺点?...静态内部类虽然保证了多线程并发下的线程安全性,但是遇到序列化对象,默认的方式运行得到的结果就是多例的。...这是一个很巧妙的方式,如果对整个方法同步,所有获取例的线程都要排队,效率就会降低。但实际只需要对创建过程同步来保证”例”,多个线程不管是否已经有例可以同时去请求。

    52720

    例模式(Singleton Pattern)百媚生1 动机2 定义结构分析优点缺点适用场景应用总结实现方式1、懒汉式(非线程安全)2、懒汉式(线程安全)4、双重检验锁模式(double checke

    例模式的要点有三个 某个类只能有一个实例必须自行创建这个实例必须自行向整个系统提供这个实例例模式是一种对象创建型模式。例模式又名单件模式或态模式。...一个系统中要求一个类只有一个实例才应当使用例模式。...例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例例模式是一种对象创建型模式。...也就是说多线程下不能正常工作。...饿汉式的创建方式一些场景中将无法使用:譬如 Singleton 实例的创建是依赖参数或者配置文件的, getInstance() 之前必须调用某个方法设置参数给它,那样这种例写法就无法使用了。

    1.1K100

    设计模式 | 例模式及典型应用

    例模式有三个要点: 构造方法私有化; 实例化的变量引用私有化; 获取实例的方法共有 角色 Singleton(例):例类的内部实现只生成一个实例,同时它提供一个静态的 getInstance()...,类装载的执行静态代码块中的代码,初始化类的实例。...静态内部类的方式利用了类装载机制来保证线程安全,只有第一次调用getInstance方法,才会装载SingletonInstance内部类,完成Singleton的实例化,所以也有懒加载的效果。...事实,实现例模式的唯一推荐方法,是使用枚举类来实现。...如果实例化的共享对象长时间不被利用,系统可能会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致共享的例对象状态的丢失。

    98721

    03.例模式

    这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、例类只能有一个实例。 2、例类必须自己创建自己的唯一实例。 3、例类必须给所有其他对象提供这一实例。...2、Windows 是多进程多线程的,操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。...因为没有加锁 synchronized,所以严格意义它并不算例模式。 这种方式 lazy loading 很明显,不要求线程安全,多线程不能正常工作。 代码实例: ?...它基于 classloder 机制避免了多线程的同步问题,不过,instance 类装载实例化,虽然导致类装载的原因有很多种,例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式...不过,由于 JDK1.5 之后才加入 enum 特性,用这种方式写不免让人感觉生疏,实际工作中,也很少用。 不能通过 reflection attack 来调用私有构造方法。 代码实例: ?

    63580

    Java设计模式(一)-例模式

    (2)例类必须自己创建自己的唯一实例。 (3)例类必须给所有其他对象提供这一实例。 1.2 例模式的应用及实现说明 (1)意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。...1.5 例模式线程安全问题 例模式 多线程的应用场合下必须小心使用。...(4)数据库连接池:数据库连接是一种数据库资源,使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率的损耗还是非常昂贵的,通过例模式来维护,就可以大大降低这种损耗。...它基于 classloader 机制避免了多线程的同步问题,不过,instance 类装载实例化,虽然导致类装载的原因有很多种,例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式...因为没有加锁 synchronized,所以严格意义它并不算例模式。这种方式延迟加载很明显,所以加载类比较快,但是对象的获取速度相对较慢,且线程不安全,多线程不能正常工作

    79000

    java设计模式-例模式详解

    例类必须自己创建自己的唯一实例例类必须给所有其他对象提供这一实例。 创建例模式的几种方式 (1)懒汉式,线程不安全 懒汉式其实是一种比较形象的称谓。既然懒,那么创建对象实例的时候就不着急。...当有多个线程并行调用 getInstance() 的时候,就会创建多个实例。也就是说多线程下不能正常工作。...这种方法非常简单,因为例的实例被声明成 static 和 final 变量了,第一次加载类到内存中就会初始化,所以创建实例本身是线程安全的。...饿汉式的创建方式一些场景中将无法使用:譬如 Singleton 实例的创建是依赖参数或者配置文件的, getInstance() 之前必须调用某个方法设置参数给它,那样这种例写法就无法使用了。...由于静态例对象没有作为Singleton的成员变量直接实例化,因此类加载不会实例化Singleton,第一次调用getInstance()将加载内部类SingletonHolder,该内部类中定义了一个

    78810

    【Java设计模式实战系列】好的例模式是怎样的?

    一个系统中要求一个类只有一个实例才应当使用例模式。...也就是说多线程下不能正常工作。...它基于类加载机制避免了多线程的同步问题 不过,instance类装载实例化,虽然导致类装载的原因有很多种,例模式中大多数都是调用 getInstance, 但也不能确定有其他的方式(或者其他的静态方法...饿汉式的创建方式一些场景中将无法使用:譬如 Singleton 实例的创建是依赖参数或者配置文件的, getInstance() 之前必须调用某个方法设置参数给它,那样这种例写法就无法使用了。...例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例例模式是一种对象创建型模式。

    53420

    【Java设计模式实战系列】好的例模式是怎样的?

    一个系统中要求一个类只有一个实例才应当使用例模式。...例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例例模式是一种对象创建型模式。...也就是说多线程下不能正常工作。...它基于类加载机制避免了多线程的同步问题 不过,instance类装载实例化,虽然导致类装载的原因有很多种,例模式中大多数都是调用 getInstance, 但也不能确定有其他的方式(或者其他的静态方法...饿汉式的创建方式一些场景中将无法使用:譬如 Singleton 实例的创建是依赖参数或者配置文件的, getInstance() 之前必须调用某个方法设置参数给它,那样这种例写法就无法使用了。

    62840

    写了这么久代码,你懂例模式吗?

    面试的时候,问到许多年轻的开发他所会的设计模式是什么,基本都会提到例模式,但是对例模式也是一知半解,开发中我们经常会运用例模式,所以我们还是要更了解例模式才对。...,反映稍慢一些,而且多线程不能正常工作。...DCL优点是资源利用率高,第一次执行getInstance例对象才被实例化,效率高。缺点是第一次加载反应稍慢一些,高并发环境下也有一定的缺陷,虽然发生的概率很小。...,并且在任何情况下都是例,上述讲的几种例模式实现中,有一种情况下他们会重新创建对象,那就是反序列化,将一个实例对象写到磁盘再读回来,从而获得了一个实例。...在上述的几个方法示例中如果要杜绝例对象被反序列化是重新生成对象,就必须加入如下方法: private Object readResolve() throws ObjectStreamException

    34110

    设计模式的征途—1.例(Singleton)模式

    相信大家都使用过Windows任务管理器,我们可以做一个尝试:Windows任务栏的右键菜单多次点击“启动任务管理器”,看能否打开多个任务管理器窗口。...例模式是一种对象创建模式。   例模式有3个要点: 某个类只能有一个实例必须自行创建这个实例必须自行向整个系统提供这个实例   2.2 结构图 ?   ...3.3 饿汉式与懒汉式例   进行测试,成都分公司的测试人员发现负载均衡器启动过程中用户再次启动负载均衡器,系统无任何异常,但当客户端提交请求出现请求分发失败,通过仔细分析发现原来系统中还是会存在多个负载均衡器的对象...但当A执行完毕,线程B并不知道实例已经被创建,将继续创建新的实例,从而导致多个例对象。...(3)很多高级面向对象编程语言如C#和Java等都提供了垃圾回收机制,如果实例化的共享对象长时间不被利用,系统则会认为它是垃圾,于是会自动销毁并回收资源,下次利用时又得重新实例化,这将导致共享的例对象状态的丢失

    63720

    Android四大组件之Activity详解

    onDestory():表示Activity即将销毁,这是Activity生命周期的最后一个回调,可以做一些回收工作和最终的资源回收。 onRestart():表示Activity正在重新启动。...一般情况下,当当前Activity从不可见重新变为可见状态,onRestart就会被调用。...这个Activity屏幕是可见的,但是并不是屏幕最前端的那个Activity。比如有另一个非全屏或者透明的Activity是Resumed状态,没有完全遮盖这个Activity。...(3)栈内复用模式(singleTask) 该模式是一种例模式,即一个栈内只有一个该Activity实例。...(4)例模式(singleInstance) 作为栈内复用模式(singleTask)的加强版,打开该Activity,直接创建一个新的任务栈,并创建该Activity实例放入新栈中。

    56120

    简单定义Python和Scala的类和对象

    Scala使用new Book来创建一个实例,而Python使用Book()来实例(实际是__new__的语法糖)。我们可以类的定义了加上一些好玩的东西,比如属性和实例。 a = Book....初始化: 书一般都会有书名,假设书名可以区分书的唯一性,创建实例必须要给这个实例一个书名,那么如何给Book这个类添加书名这个属性: Scala: object Test{ def main(args...Scala的Book类后面的圆括号里跟着一个标识符name(称为类参数),使用这种方法构造的类,要求使用者刚开始创建这个实例必须要提供相应的数据,我们Book这个类里面加上了println方法...,创建book这个实例,就会打印出来name这个参数。...Scala的类定义里面是不允许存在静态方法的,所以Scala提供了object这种的例对象,例对象和类的定义很像,但是例对象不需要实例化,例对象本身就是一等的对象,例对象的名称可以理解为附加在对象的的名称

    55510

    设计模式(七):例模式

    什么是例模式 ? 例模式,是一种常用且简单的软件设计模式,属于创建型模式。应用例模式的类全局范围内必须只能有一个实例对象存在,且外部不需要实例化对象,就可以访问这个类的唯一实例对象。...注意: 例类只能有一个实例例类必须自己创建自己的唯一实例例类必须给外部提供访问唯一实例的方式。 ? 应用场景与注意事项 ?...允许可变数目的实例 缺点: 没有抽象层,不能继承,拓展难度大 例类职责多,与单一职责原则冲突 使用注意事项: 使用时不能用反射模式创建例,否则会实例化一个新的对象 ;使用例模式注意线程安全问题...但是饿汉模式只要类被装载就会实例化,没有延迟加载的作用,而静态内部类方式类被装载并不会立即实例化,而是需要使用实例的时候才会装载类,从而完成的实例化。...实际工作中,我经常使用的是静态内部类模式。以上就是今天《例模式》的讲解,良好的代码风格需要长期不断的积累学习。

    39740
    领券