什么是单例设计模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是单例设计模式相关的知识,希望对你有一定的参考价值。
参考技术A 问题一:什么是单例设计模式 java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
例: 在下面的对象图中,有一个单例对象,而客户甲、客户乙 和客户丙是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。一些资源管理器常常设计成单例模式。
外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中管理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来管理这些属性文件。
一个例子:Windows 回收站。
在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。
两种形式:
1,饿汉式单例类
public class Singleton
private Singleton()
在自己内部定义自己一个实例,是不是很奇怪?
注意这是private 只供内部调用
private static Singleton instance = new Singleton();
这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance()
return instance;
2,懒汉式单例类
public class Singleton
private static Singleton instance = null;
public static synchronized Singleton getInstance()
这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。...>>
问题二:将一个类设计成单例设计模式,需要哪些步骤 单例模式(Singleton Pattern)是一个比较简单的模式。
定义:
确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。
通用类图:
通用代码:
Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的。
/**
* 线程安全的单例模式
* 饿汉式单例
* @author Administrator
*
*/
public class Singleton
private static final Singleton singleton = new Singleton();
限制产生多个对象
private Singleton()
通过该方法获得实例对象
public static Singleton getSingleton()
return singleton;
类中其他方法尽量是static
public static void doSomething()
单例模式的优点:
由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显了。
由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决。
单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
单例模式的缺点:
单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能用mock的方式虚拟一个对象。
单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中。
单例模式的使用场景:
要求生成唯一序列号的环境;
在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;
创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源;
需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为static的方式)。
单例模式的注意事项:
1. 在高并 *** 况下,请注意单例模式的线程同步问题。
/**
* 懒汉式单例
* @author Administrator
*
*/
public class Singleton2
private static Singleton2 singleton = null;
限制产生多个对象
private Singleton2()
......>>
问题三:什么是单例模式 java模式之单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
例: 在下面的对象图中,有一个单例对象,而客户甲、客户乙 和客户丙是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。一些资源管理器常常设计成单例模式。
外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中管理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来管理这些属性文件。
一个例子:Windows 回收站。
在整个视窗系统中,回哗站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。
两种形式:
1,饿汉式单例类
public class Singleton
private Singleton()
在自己内部定义自己一个实例,是不是很奇怪?
注意这是private 只供内部调用
private static Singleton instance = new Singleton();
这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance()
return instance;
2,懒汉式单例类
public class Singleton
private static Singleton instance = null;
public static synchronized Singleton getInstance()
这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。...>>
问题四:请问,Java中,单例设计模式是个什么意思,优势何在。 单例模式:保证一个类在使用过程中,只有一个实例。优势就是他的作用,这个类永远只有一个实例。
步骤: 1. 将该类的构造方式私有;
2. 在内部实例化一个该类的实例;
3. 提供接口给外部访问。
public class SingletonDemo
private SingletonDemo (); 1.
private static SingletonDemo mInstance = new SingletonDemo(); 2.
public static SingletonDemo getInstance() 3.
return mInstance;
问题五:将一个类做成单例是什么意思 单例模式(Singleton Pattern)是一个比较简单的模式。 定义: 确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。
问题六:单例模式的好处和缺点?为什么要用单例模式?详细才给分 1 单例模式 只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等
2 单例的缺点 就是不适用于变化的对象,如果同一弗型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
用单例模式,就是在适用其优点的状态下使用。
问题七:什么是Java单例模式啊? Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton
private Singleton()
在自己内部定义自己一个实例,是不是很奇怪?
注意这是private 只供内部调用
private static Singleton instance = new Singleton();
这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance()
return instance;
第二种形式:
public class Singleton
private static Singleton instance = null;
public static synchronized Singleton getInstance()
这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
这些都是Java中的基础知识,如果你想更加详细的了解相关知识,你可以到秒秒学的网站上找到相应的课程。
问题八:你熟悉的设计模式有哪些?写出单例模式的实现代码 一共23种设计模式!
引用《软件秘笈-设计模式那点事》书籍:
按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。
创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。
创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:
? 工厂方法模式(Factory Method Pattern)
? 抽象工厂模式(Abstract Factory Pattern)
? 建造者模式(Builder Pattern)
? 原型模式(Prototype Pattern)
? 单例模式(Singleton Pattern)
结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:
? 适配器模式(Adapter Pattern)
? 桥接模式(Bridge Pattern)
? 组合模式(posite Pattern)
? 装饰者模式(Decorator Pattern)
? 外观模式(Facade Pattern)
? 享元模式(Flyweight Pattern)
? 代理模式(Proxy Pattern)
行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式:
? 责任链模式(Chain of Responsibility Pattern)
? 命令模式(mand Pattern)
? 解释器模式(Interpreter Pattern)
? 迭代器模式(Iterator Pattern)
? 中介者模式(Mediator Pattern)
? 备忘录模式(Memento Pattern)
? 观察者模式(Observer Pattern)
? 状态模式(State Pattern)
? 策略模式(Strategy Pattern)
? 模板方法模式(Template Method Pattern)
? 访问者模式(Visitor Pattern)
单例模式实现1:
public class Singleton
类共享实例对象
private static Singleton singleton = null;
私有构造方法
private Singleton()
System.out.println(-- this is Singleton!!!);
获得单例方法
public synchronized static Singleton getInstance()
判断 共享对象是否为null ,如何为null则new一个新对象
if (singleton == null)
singleton = new Singleton();
return singleton;
单例模式实现2:
public class Singleton
类共享实例对象 实例化
private s......>>
问题九:23种设计模式中哪些最重要 总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
最常用的是:工厂模式,单例模式,建造者模式,代理模式。
其实都了解一下比较好。
问题十:设计模式中,属于结构型模式的有哪些 设计模式主要分三个类型:创建型、结构型和行为型。
其中创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、mand,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
结构型有:
十七、posite,组合模式:将对象组合成树形结构以表示部分整体的关系,posite使得用户对单个对象和组合对象的使用具有一致性。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
二十二、Bridge,桥模式:将抽象部分与它的实现部分......>>
java基础-单例设计模式
什么是单例模式,为什么需要单例模式,设计模式可以说是一种套路一个规范
一. 什么是单例模式
因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。
二. 单例模式的特点
1. 单例模式只能有一个实例。
2. 单例类必须创建自己的唯一实例。
3. 单例类必须向其他对象提供这一实例。
三. 单例模式VS静态类
在知道了什么是单例模式后,我想你一定会想到静态类,“既然只使用一个对象,为何不干脆使用静态类?”,这里我会将单例模式和静态类进行一个比较。
1. 单例可以继承和被继承,方法可以被override,而静态方法不可以。
2. 静态方法中产生的对象会在执行后被释放,进而被GC清理,不会一直存在于内存中。
3. 静态类会在第一次运行时初始化,单例模式可以有其他的选择,即可以延迟加载。
4. 基于2, 3条,由于单例对象往往存在于DAO层(例如sessionFactory),如果反复的初始化和释放,则会占用很多资源,而使用单例模式将其常驻于内存可以更加节约资源。
5. 静态方法有更高的访问效率。
6. 单例模式很容易被测试。
下图说示,
单例模式就是只有一个new对象实例,所以是应用在new对象特别费劲麻烦的时候,
比如spring啊或者很多框架,你new一个东西,调用的东西很多,太慢,所以很多时候需要单例模式
而单例模式又分为 1 饿汉式 2懒汉式
什么是饿汉式。让我们来看看下面的代码
package single; public class Single { private Single(){ } private static Single single = new Single(); public static Single getSingle(){ return single; } }
1只有一个new(符合了单例模式),并且是在类内部
2private私有定义了构造函数和new过程,使得外部无法new Single并且也无法调用比如什么single.方法等
3外部只能通过一个方法获得single那就是如下
package single; public class test { public static void main(String[] args) { Single s1 = Single.getSingle(); Single s2 = Single.getSingle(); Single s3 = Single.getSingle(); Single s4 = Single.getSingle(); } }
好处一,不需要new,一直都是指向第一次new Single时的single;
好处二,因为 private static Single single = new Single();是static的运行一次后在那等你调用;
这就是单例模式中的饿汉式单例模式-内部帮你Newl出来对象了
下面我们看看单例模式-懒汉式
package single; public class single1{ private single1(){ } private static single1 s1 = null; public static single1 getInstance() { if(s1==null) { s1=new single1(); } return s1; } }
第一次是null后面就不是了,因为是static的,第一次变了之后,后面每次都是new single1
最开始是null,直到第一个人调用我new一个对象,之后所有调用我的,都用这个对象
比如:餐馆等你点菜,来第一个点了一个菜(对象)那么后面的都用这个菜,所有也是懒的形容由来
以上是关于什么是单例设计模式的主要内容,如果未能解决你的问题,请参考以下文章